我正在遍历 CSV 以将某些记录的名称字段插入/更新到表中。该脚本不是为了插入记录,如果它存在,只更新名称字段。
较大的 CSV 文件需要相当长的时间,所以我想知道是否可以使用 ON DUPLICATE KEY UPDATE 命令将此代码修改为多个 INSERT 查询,该命令只会更新记录的名称字段。
CSV 不包含表的所有字段,仅包含主键和名称的字段。因此,REPLACE 不适用于这种情况。
if (($handle = fopen($_FILES['csv']['tmp_name'], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$title = 'Import: '.date('d-m-Y').' '.$row;
# CHECK IF ALREADY EXISTS
$explode = explode('-',$data[0]);
$areacode = $explode[0];
$exchange = $explode[1];
$number = $explode[2];
$update = "INSERT INTO ".TBLPREFIX."numbers SET
area_code = ".$areacode.",
exchange = ".$exchange.",
number = ".$number.",
status = 1,
name = '".escape($data[1])."'
ON DUPLICATE KEY UPDATE name = '".escape($data[1])."'";
mysql_query($update) or die(mysql_error());
$row++;
}
fclose($handle);
$content .= success($row.' numbers have been imported.');
}
最佳答案
开始插入前打开一个事务,完成后提交。这样数据库就可以优化磁盘上的写操作,因为它发生在一个单独的内存空间中。在没有事务的情况下,所有单个查询都会立即自动提交并对所有其他查询有效。
至少我希望您使用 InnoDB 作为存储引擎 - MyISAM 不支持事务并且有其他明显的缺点。如果可能,您应该避免使用它。
关于php - MySQL 重复键更新多次插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538274/