我正在循环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.');
}
答案 0 :(得分:0)
在开始插入之前打开一个事务,并在完成后提交它。这样,数据库可以优化磁盘上的写操作,因为它发生在单独的内存空间中。如果没有事务,所有单个查询将立即自动提交,并且对每个其他查询都有效。
至少我希望您使用InnoDB作为存储引擎 - MyISAM不支持事务并且还有其他重大缺陷。如果可能的话,你应该避免使用它。