Php MySQL上的重复密钥更新多次插入

Php MySQL上的重复密钥更新多次插入,php,mysql,sql,csv,Php,Mysql,Sql,Csv,我正在通过CSV循环,将一些记录的名称字段插入/更新到表中。脚本不能插入记录,如果记录存在,只更新名称字段 对于较大的CSV文件,这需要花费相当长的时间,因此我想知道是否可以使用ON DUPLICATE KEY UPDATE命令将此代码修改为多个INSERT查询,该命令只会更新记录的name字段 CSV不包含表的所有字段,仅包含主键和名称的字段。因此,“替换”在这种情况下不起作用 if (($handle = fopen($_FILES['csv']['tmp_name'], "r")) !==

我正在通过CSV循环,将一些记录的名称字段插入/更新到表中。脚本不能插入记录,如果记录存在,只更新名称字段

对于较大的CSV文件,这需要花费相当长的时间,因此我想知道是否可以使用ON DUPLICATE KEY UPDATE命令将此代码修改为多个INSERT查询,该命令只会更新记录的name字段

CSV不包含表的所有字段,仅包含主键和名称的字段。因此,“替换”在这种情况下不起作用

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不支持事务,并且有其他明显的缺点。如果可能的话,你应该避免