mysql - LOAD DATA LOCAL INFILE 在内部连接更新的情况下生成 null

标签 mysql sql opencart

我正在尝试在 opencart 数据库中上传文件,我想批量上传产品 UPC 编号,并且我正在使用以下查询:

CREATE TEMPORARY TABLE  `my_temp_table`
(
     product_id INT(11),
     name VARCHAR(255),
     upc VARCHAR(12)
); 

LOAD DATA LOCAL INFILE '/home/mupckuco/dev/oc_product.csv'
INTO TABLE `my_temp_table`
FIELDS TERMINATED BY ','
(`product_id`, `name`, `upc`);

UPDATE `oc_product`
INNER JOIN `my_temp_table` on `my_temp_table`.`product_id` = `oc_product`.`product_id`
SET `oc_product`.`upc` = `my_temp_table`.`upc`;

DROP TEMPORARY TABLE `my_temp_table`;

首先,我使用以下查询导出了包含产品 ID、产品名称的表以及包含产品 UPC 的列:

SELECT  `oc_product`.`product_id` ,  `oc_product_description`.`name` ,  `oc_product`.`upc` 
FROM  `oc_product` 
INNER JOIN  `oc_product_description` ON  `oc_product`.`product_id` =  `oc_product_description`.`product_id` 

但不幸的是,这一行

UPDATE `oc_product` INNER JOIN `my_temp_table` on `my_temp_table`.`product_id` = `oc_product`.`product_id` SET `oc_product`.`upc` = `my_temp_table`.`upc`

正在表中插入NULL。

我首先尝试创建一个普通表(不是临时表),因此我看到 UPC 列中的所有内容都插入为 NULL。

我正在导出为 Microsoft Excel 的 CSV,并使用相同的扩展名保存文件。问题可能出在哪里?

这是 csv 文件和更新后 my_temp_table 结果的一些示例:

excel csv

my_temp_table

最佳答案

哇,我从来没有见过有人尝试将 CSV 直接导入数据库,然后使用 JOIN 运行更新,也许您的背景是 DBA 而不是 PHP 开发人员?

无论如何,我建议您将 CSV 导入到 PHP 中的数组中:

$csv = array_map('str_getcsv', file('/home/mupckuco/dev/oc_product.csv'));

然后循环它以生成 UPDATE 语句。

关于mysql - LOAD DATA LOCAL INFILE 在内部连接更新的情况下生成 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47394000/

相关文章:

mysql - MySQL中将逗号分隔的输入参数转换为int行的函数

mysql - 使用内部子查询优化此 MySQL 查询

php - 在 MySQL 中将 like 和 % 与列名一起使用

php - 检索给定日期时间前 10 分钟的记录

javascript - OpenCart PageSpeed - 消除首屏内容中的渲染阻塞 JavaScript 和 CSS

MySql:在复杂的 if 语句中更改源表

mysql - 如何创建mysql数据库镜像以备不时之需?

mysql查询 "SHOW COLUMNS FROM table like ' colmunname'":questions

MySQL:根据给定列上的多个键选择多行

mysql - 如何对 x 个相同的 MySQL SUM 表进行求和?