我正在使用从第三方来源提取的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;
答案 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中较高者的行,如果我们使用<而不是>。