mysql与LOAD DATA INFILE重复

时间:2009-12-27 02:50:30

标签: sql mysql database duplicates load-data-infile

使用LOAD DATA INFILE时,有没有办法标记重复行,或将任何/所有重复项转储到单独的表中?

2 个答案:

答案 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,asdf1,tyui2,jkl添加到日志表中。根据时间戳,可以将行与特定的LOAD DATA语句相关联。