При использовании LOAD DATA INFILE есть ли способ либо пометить повторяющуюся строку, либо сбросить любые/все дубликаты в отдельную таблицу?
дубликаты mysql с LOAD DATA INFILE
Ответы (2)
Из документации LOAD DATE INFILE:
Ключевые слова REPLACE и IGNORE управляют обработкой входных строк, которые дублируют существующие. строки по уникальным значениям ключей:
- Если вы укажете REPLACE, входные строки заменят существующие строки. Другими словами, строки, которые имеют то же значение первичного ключа или уникального индекса, что и существующая строка. См. раздел 12.2.7, «Синтаксис REPLACE».
- Если вы укажете IGNORE, входные строки, которые дублируют существующую строку с уникальным значением ключа, будут пропущены. Если вы не укажете ни один из параметров, поведение будет зависеть от того, указано ли ключевое слово LOCAL. Без LOCAL возникает ошибка при обнаружении повторяющегося значения ключа, а остальная часть текстового файла игнорируется. С LOCAL поведение по умолчанию такое же, как если бы было указано IGNORE; это связано с тем, что сервер не может остановить передачу файла во время операции.
По сути, нет никакого способа перенаправить повторяющиеся записи в другую таблицу. Вам придется загрузить их все, а затем создать другую таблицу для хранения неповторяющихся записей.
Похоже, что на самом деле есть что-то, что вы можете сделать, когда дело доходит до дублирования строк для вызовов LOAD DATA. Однако подход, который я нашел, не идеален: он действует скорее как журнал для всех удалений в таблице, а не только для вызовов LOAD DATA. Вот мой подход:
Таблица test:
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
.