MySQL LOAD DATA LOCAL INFILE避免重复

时间:2019-06-23 04:37:40

标签: mysql load-data-infile

我正在使用LOAD DATA LOCAL INFILE语句快速上传文件。

LOAD DATA LOCAL INFILE 'file_location/file.txt'
    INTO TABLE mytable 
    FIELDS TERMINATED by '\t'
    LINES TERMINATED BY '\n'
    IGNORE 18 LINES //ignore some header info
    (sampleID, testID);

但是过去我已经加载了一些文件,我想避免重复。

数据库结构包括自动递增的PK作为附加列。

不必打开每个文件并在上传之前进行搜索以确定这些记录是否已经存在,是否可以基于具有sampleID和testID行的方式修改我用来忽略重复行的命令在表中与传入文件匹配?

例如,假设当前表具有以下行:

tablePKID    sampleID    testID
    0         0001        A
    1         0001        B
    2         0003        A
    3         0003        B

我希望导入一个包含以下记录的文件

  0001        A
  0001        B
  0001        C
  0005        A
  0005        B

如何仅确保

  0001        C
  0005        A
  0005        B

是进口的吗?

1 个答案:

答案 0 :(得分:1)

我不知道如何使tablePKID从0自动递增到现在,您现在可以在samplid和testid以及load..IGNORE上指定唯一键

DROP TABLE IF EXISTS T;
CREATE TABLE T
(tablePKID   INT auto_increment primary key, 
sampleID VARCHAR(10),   testID VARCHAR(10));

alter table t
    add unique key k1(sampleid,testid);

INSERT INTO T (sampleid,testid) VALUES
(   '0001'   ,     'A'),
(   '0001'   ,     'B'),
(   '0003'   ,     'A'),
(   '0003'   ,     'B');

文件data.txt

sampleid    testid
"0001"  "A"
"0001"  "B"
"0001"  "C"
"0005"  "A"
"0005"  "B"


LOAD DATA LOCAL INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
     ignore
    INTO TABLE t 
    FIELDS TERMINATED by '\t'
    enclosed by '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES 
    (sampleID, testID);

+-----------+----------+--------+
| tablePKID | sampleID | testID |
+-----------+----------+--------+
|         1 | 0001     | A      |
|         2 | 0001     | B      |
|         3 | 0003     | A      |
|         4 | 0003     | B      |
|         5 | 0001     | C      |
|         6 | 0005     | A      |
|         7 | 0005     | B      |
+-----------+----------+--------+
7 rows in set (0.00 sec)