Мне нужно импортировать большой набор записей, которые могут содержать дубликаты. Таблица представляет собой таблицу MyISAM с составным первичным ключом и внешними ключами. Как указать, что если комбинация значений первичного ключа вставляемой записи уже существует в таблице, она просто отбросит конкретную вставку, не выдавая ошибку или не вставляя дубликат?
Вы можете использовать ключевое слово IGNORE
в INSERT
s:
Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении инструкции INSERT, рассматриваются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка все еще не вставлена, но ошибка не выдана. (Источник)
Пример:
CREATE TABLE my_table (
id int, name varchar(10), value int, PRIMARY KEY (id, name)
);
Query OK, 0 rows affected (0.03 sec)
INSERT IGNORE INTO my_table (id, name, value) VALUES (1, 'a', 100),
(1, 'b', 200),
(1, 'b', 300);
Query OK, 2 rows affected (0.00 sec)
Records: 3 Duplicates: 1 Warnings: 0
SELECT * FROM my_table;
+----+------+-------+
| id | name | value |
+----+------+-------+
| 1 | a | 100 |
| 1 | b | 200 |
+----+------+-------+
2 rows in set (0.00 sec)
Вам нужно использовать ключевое слово IGNORE
:
INSERT IGNORE INTO ...
или
LOAD DATA INFILE ... IGNORE ...
Подробнее о том, как использовать последний, можно найти здесь.