MySQL LOAD DATA LOCAL INFILE, избегающий дубликатов - PullRequest
0 голосов
/ 23 июня 2019

Я использую этот оператор 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 Ответ

1 голос
/ 23 июня 2019

Я не знаю, как вы установили 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)
...