MySQL INSERT IGNORE не работает - PullRequest
7 голосов
/ 14 июня 2010

Вот моя таблица с некоторыми примерами данных

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)

Индексы не определены, ни один из этих столбцов не является первичным.

Что я не знаю?

Ответы [ 4 ]

13 голосов
/ 14 июня 2010

Из документов :

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения.Например, без IGNORE строка, в которой дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дублирующего ключа, и оператор прерывается.С IGNORE строка все еще не вставлена, но ошибка не выдана.

(мой курсив).

Ваша строка не дублирует «существующий индекс UNIQUE или значение PRIMARY KEY», поскольку у вас нет ни первичного ключа, ни уникальногоограничения.


Если, как вы упомянули в одном из ваших комментариев, вы не хотите, чтобы ни одно из полей было уникальным, но вы do хотите, чтобы комбинация была уникальной, вам нужен составной первичныйКлюч в обеих колонках (сначала избавьтесь от дубликатов):

alter table MYTABLE add primary key (a_id,b_id)
3 голосов
/ 14 июня 2010

Если вы не поставите критерий UNIQUE или не установите PRIMARY KEY, MySql не будет знать, что ваша новая запись является дубликатом.

1 голос
/ 14 июня 2010

если первичного ключа нет, нельзя игнорировать дубликат ключа.Вы всегда должны устанавливать первичный ключ, так что, пожалуйста, сделайте это - и если вы хотите иметь дополнительные столбцы, которые не должны дублироваться, установите их как «уникальные».

0 голосов
/ 14 июня 2010

Если я вас правильно понял, после запуска команды вставки ваша таблица выглядит следующим образом

1   225
2   494
3   589
4   230
2   494

Если так, то ответ таков, потому что ваш дизайн таблицы допускает дублирование.

Если вы хотите, чтобы вторая запись не вставлялась, вам нужно определить столбец a_id как первичный ключ или уникальный индекс. Если вы это сделаете, тогда оператор игнорирования вставки будет работать так, как вы ожидаете, то есть вставлять записи, игнорировать ошибки, такие как попытка добавить дублирующую запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...