MySQL LOAD DATA LOCAL INFILE 避免重复

MySQL LOAD DATA LOCAL INFILE avoiding duplicates

我正在使用这个 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 和table 中的 testID 行是否与传入文件匹配?

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

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

是进口的?

我不知道你是如何让 tablePKID 从 0 自动递增的,现在你可以在 samplid 和 testid 上指定一个唯一的键并加载..例如忽略

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)