php - MySQL 重复键更新多次插入

标签 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.');
    }

最佳答案

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

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

关于php - MySQL 重复键更新多次插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538274/

相关文章:

sql - 在 Oracle SQL 中,如何按序号位置选择列?

sql - 在 SQL 中将变量传递给 .exe

c# - LINQ .OrderBy 创建嵌套套管

php - 如何将文件内容复制到 PHP 中的临时文件中?

php - Selenium:如何从选择菜单中选择一个选项?

php - 在 MySQL 中存储逗号分隔的数据

python - 提高查询性能

php - 在php中转换unix时间

mysql - 从 RMySQL 连接到 SQL 服务器的安全身份验证错误

mysql - 如何通过转义插入 MySQL 语句的字符串来手动防止 sql 注入(inject)