дубликаты mysql с LOAD DATA INFILE

При использовании LOAD DATA INFILE есть ли способ либо пометить повторяющуюся строку, либо сбросить любые/все дубликаты в отдельную таблицу?


person mike    schedule 27.12.2009    source источник
comment
Связано: stackoverflow.com/questions/1506511/   -  person OMG Ponies    schedule 27.12.2009


Ответы (2)


Из документации LOAD DATE INFILE:

Ключевые слова REPLACE и IGNORE управляют обработкой входных строк, которые дублируют существующие. строки по уникальным значениям ключей:

  • Если вы укажете REPLACE, входные строки заменят существующие строки. Другими словами, строки, которые имеют то же значение первичного ключа или уникального индекса, что и существующая строка. См. раздел 12.2.7, «Синтаксис REPLACE».
  • Если вы укажете IGNORE, входные строки, которые дублируют существующую строку с уникальным значением ключа, будут пропущены. Если вы не укажете ни один из параметров, поведение будет зависеть от того, указано ли ключевое слово LOCAL. Без LOCAL возникает ошибка при обнаружении повторяющегося значения ключа, а остальная часть текстового файла игнорируется. С LOCAL поведение по умолчанию такое же, как если бы было указано IGNORE; это связано с тем, что сервер не может остановить передачу файла во время операции.

По сути, нет никакого способа перенаправить повторяющиеся записи в другую таблицу. Вам придется загрузить их все, а затем создать другую таблицу для хранения неповторяющихся записей.

person OMG Ponies    schedule 27.12.2009
comment
Интересно, можно ли создать триггер BEFORE INSERT, который запрашивает таблицу, чтобы увидеть, существует ли идентификатор вставки, а затем вставляет его в другую таблицу, если он существует. Это было бы чертовски медленно, но могло бы работать... (триггеры BEFORE/AFTER INSERT вызываются для каждой строки в запросе LOAD DATA). - person cmptrgeekken; 27.02.2010
comment
Привет друзья, у меня есть таблица с 7 столбцами, первичный ключ у меня не очень работает для этого запроса, так как он основан на столбцах и значениях, я хочу вставить или обновить один столбец из файла csv; Проблема в том, что Duplicate используется неправильно, и если возможно для этого сценария: если в строке три столбца A, B, C совпадают со своими значениями (запись уже существует), выполните обновление; Если совпадений нет, вставьте в очередь. - person ; 10.11.2016

Похоже, что на самом деле есть что-то, что вы можете сделать, когда дело доходит до дублирования строк для вызовов 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.

person cmptrgeekken    schedule 02.03.2010
comment
Привет друзья, у меня есть таблица с 7 столбцами, первичный ключ у меня не очень работает для этого запроса, так как он основан на столбцах и значениях, я хочу вставить или обновить один столбец из файла csv; Проблема в том, что Duplicate используется неправильно, и если возможно для этого сценария: если в строке три столбца A, B, C совпадают со своими значениями (запись уже существует), выполните обновление; Если совпадений нет, вставьте в очередь. - person ; 10.11.2016