如果存在则更新否则插入 csv 数据 MySQL

if exists update else insert csv data MySQL

我正在使用从第三方来源提取的 csv 文件填充 MySQL table。每天 csv 都会更新,如果 a、b 和 c 列已经存在,我想更新 MySQL table 中的行,否则插入该行。我使用加载数据 infile 进行初始加载,但我想根据每日 csv 拉取进行更新。我熟悉 INSERT...ON DUPLICATE,但不熟悉 csv 导入的上下文。关于如何在 INSERT...ON DUPLICATE a, b, c 中嵌套 LOAD DATA LOCAL INFILE 的任何建议 - 或者如果这是最好的方法,我们将不胜感激。

LOAD DATA LOCAL INFILE 'C:\Users\nick\Desktop\folder\file.csv' 
INTO TABLE db.tbl
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 lines;     

因为你使用 LOAD DATA LOCAL INFILE,它等同于指定 IGNORE:即重复将被跳过。 但是

If you specify REPLACE, input rows replace existing rows. In other words, rows that have the same value for a primary key or unique index as an existing row.

所以你更新导入可能是

LOAD DATA LOCAL INFILE 'C:\Users\nick\Desktop\folder\file.csv' 
REPLACE
INTO TABLE db.tbl
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 lines;

https://dev.mysql.com/doc/refman/5.6/en/load-data.html

如果您需要更复杂的合并逻辑,您可以将 CSV 导入临时文件 table 然后执行 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE

我发现最好的方法是插入带有标准 LOAD DATA LOCAL INFILE 的文件

LOAD DATA LOCAL INFILE 
INTO TABLE db.table
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 lines;

并使用以下删除重复项。请注意,下面的命令通过将 db.table 定义为 a 和 b.

来将其与自身进行比较
delete a.* from db.table a, db.table b
where a.id > b.id
and a.field1 = b.field1
and a.field2 = b.field2
and a.field3 = b.field3; 

要使用此方法,id 字段必须是一个自动增量主字段 key.The 上面的命令然后删除在 field1 AND field2 AND field3 上包含重复项的行。在这种情况下,它将删除具有两个自动增量 id 中较高者的行,如果我们使用 < 而不是 >,这同样有效。