MySQL On Duplicate Key更新多次插入

时间:2013-01-26 15:17:43

标签: php mysql sql csv

我正在循环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.');
    }

1 个答案:

答案 0 :(得分:0)

在开始插入之前打开一个事务,并在完成后提交它。这样,数据库可以优化磁盘上的写操作,因为它发生在单独的内存空间中。如果没有事务,所有单个查询将立即自动提交,并且对每个其他查询都有效。

至少我希望您使用InnoDB作为存储引擎 - MyISAM不支持事务并且还有其他重大缺陷。如果可能的话,你应该避免使用它。