我目前正在成功使用LOAD DATA LOCAL INFILE
,通常使用REPLACE
。但是,我现在尝试使用相同的命令将CSV文件加载到表中,但只替换特定的列。
例如,表格目前如下:
ID date num1 num2
01 1/1/2017 100 200
01 1/2/2017 101 201
01 1/3/2017 102 202
其中ID
和date
是主键。
我有一个类似的CSV,但只有ID, date, num1
作为列。我想将新CSV加载到表中,但保留num2
中的任何内容。
我目前的代码this post:
LOAD DATA LOCAL INFILE mycsv.csv
REPLACE INTO TABLE mytable
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(ID, date, num1)
同样,当我替换所有列时,我的代码完美无缺,但是当我尝试仅替换选择列时,它会使用NULL值填充其他列。类似的帖子(就像我引用的那样)没有帮助。
我不知道这是否是特定于python的问题,但是我正在使用MySQLdb
来连接数据库,而且我熟悉local_infile
参数,这一切都运行良好。 MySQL版本5.6.33。
答案 0 :(得分:0)
只需将csv表加载到类似结构的临时表中,然后运行UPDATE JOIN
:
CREATE TABLE mytemptable AS SELECT * FROM mytable LIMIT 1; --- RUN ONLY ONCE
DELETE FROM mytemptable;
LOAD DATA LOCAL INFILE mycsv.csv
INTO TABLE mytemptable
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(ID, date, num1);
UPDATE mytable t1
INNER JOIN mytemptable t2 ON t1.ID = t2.ID AND t1.`date` = t2.`date`
SET t1.num1 = t2.num1;