使用LOAD DATA INFILE时,有没有办法标记重复行,或将任何/所有重复项转储到单独的表中?
答案 0 :(得分:14)
来自LOAD DATE INFILE documentation:
REPLACE和IGNORE关键字控制对唯一键值上的现有行进行复制的输入行的处理:
- 如果指定REPLACE,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行的值相同。 See Section 12.2.7, “REPLACE Syntax”。
- 如果指定IGNORE,则会跳过复制唯一键值上现有行的输入行。如果未指定任一选项,则行为取决于是否指定了LOCAL关键字。如果没有LOCAL,则在找到重复键值时会发生错误,并忽略文本文件的其余部分。使用LOCAL时,默认行为与指定IGNORE时的行为相同;这是因为服务器无法在操作过程中停止传输文件。
实际上,无法将重复记录重定向到其他表。您必须全部加载它们,然后创建另一个表来保存非重复的记录。
答案 1 :(得分:3)
对于LOAD DATA调用的重复行,看起来实际上 可以做些什么。但是,我发现的方法并不完美:它更多地作为表的所有删除的日志,而不仅仅是LOAD DATA调用。这是我的方法:
表测试:
CREATE TABLE test (
id INTEGER PRIMARY KEY,
text VARCHAR(255) DEFAULT NULL
);
表 test_log :
CREATE TABLE test_log (
id INTEGER, -- not primary key, we want to accept duplicate rows
text VARCHAR(255) DEFAULT NULL,
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
触发 del_chk :
delimiter //
drop trigger if exists del_chk;
CREATE TRIGGER del_chk AFTER DELETE ON test
FOR EACH ROW
BEGIN
INSERT INTO test_log(id,text) values(OLD.id,OLD.text);
END;//
delimiter ;
测试导入(/home/user/test.csv
):
1,asdf
2,jkl
3,qwer
1,tyui
1,zxcv
2,bnm
查询:
LOAD DATA INFILE '/home/ken/test.csv'
REPLACE INTO TABLE test
FIELDS
TERMINATED BY ','
LINES
TERMINATED BY '\n' (id,text);
运行上述查询将导致将1,asdf
,1,tyui
和2,jkl
添加到日志表中。根据时间戳,可以将行与特定的LOAD DATA
语句相关联。