Вот моя таблица с некоторыми демонстрационными данными
a_id | b_id
------------
1 225
2 494
3 589
Когда я выполняю этот запрос
INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494')
Это вставляет обе тех строки, когда это, как предполагается, игнорирует вторую пару значения (2, 494)
Никакие индексы не определили, ни один из тех столбцов являются основными.
Что я не знаю?
Из docs :
Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дублирования ключа, и оператор прерывается. При IGNORE строка по-прежнему не вставляется, но ошибка не выдается.
(курсив мой).
Ваша строка не дублирует «существующий УНИКАЛЬНЫЙ индекс или значение ПЕРВИЧНОГО КЛЮЧА», поскольку у вас нет первичного ключа или каких-либо уникальных ограничений.
Если, как вы упомянули в одном из своих комментариев, вы не хотите, чтобы ни одно из полей было уникальным, но вы действительно хотите, чтобы комбинация была уникальной, вам понадобится составной первичный ключ для обоих столбцов (избавьтесь от сначала любые дубликаты):
alter table MYTABLE add primary key (a_id,b_id)
Если вы не установите критерий UNIQUE
или не установите PRIMARY KEY
, MySql не узнает, что ваша новая запись является дубликатом.
Если я правильно вас понял, после того, как вы запустите команду вставки, ваша таблица будет выглядеть так
1 225
2 494
3 589
4 230
2 494
Если да, то ответ заключается в том, что дизайн вашей таблицы позволяет дубликаты.
Если вы хотите предотвратить вставку второй записи, вам нужно определить столбец a_id как первичный ключ или уникальный индекс. Если вы это сделаете, тогда оператор игнорирования вставки будет работать так, как вы ожидаете, то есть вставлять записи, игнорировать ошибки, такие как попытка добавить повторяющуюся запись.
если нет первичного ключа, то не может быть и дублирующего ключа, который нужно игнорировать. вы всегда должны устанавливать первичный ключ, поэтому сделайте это - и если вы хотите иметь дополнительные столбцы, которые не должны дублироваться, установите их как "уникальные".