if exists update else插入csv数据MySQL

时间:2015-08-25 21:05:34

标签: mysql csv sql-update sql-insert

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

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;     

2 个答案:

答案 0 :(得分:7)

由于您使用LOAD DATA LOCAL INFILE,因此相当于指定IGNORE:即将跳过重复项。 但是

  

如果指定REPLACE,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行具有相同的行。

所以你更新导入可能是

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导入临时表,然后发出INSERT ... SELECT ... ON DUPLICATE KEY UPDATE

答案 1 :(得分:0)

我发现执行此操作的最佳方法是使用标准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字段为自动增量主键。上述命令将删除包含field1 AND field2 AND field3上的重复的行。在这种情况下,它将删除具有两个自动增量ID中较高者的行,如果我们使用<而不是>。