Как найти дубликат идентификатора в таблице при выполнении INSERT IGNORE? - PullRequest
0 голосов
/ 06 января 2010

Я знаю, что при выполнении INSERT IGNORE дублирующиеся записи игнорируются и ошибки становятся предупреждением, но вот что мне нужно.

Сценарий: у нас есть таблица с 2 столбцами (id, name), где ОБА UNIQUE, а id - PRIMARY KEY.

Когда вы делаете INSERT IGNORE для столбца name, он создает следующий AUTO_INCREMENT для id (хотя позже он не существует в вашей БД, он просто пропущен), и когда вы вызываете LAST_INSERT_ID, он дает Вы, что следующий id. Однако мне нужно найти id, который привел к игнорированию запроса. Другими словами id из name, который был дубликатом.

Любой трюк MySQL / PHP приветствуется. :)

Спасибо.

1 Ответ

0 голосов
/ 06 января 2010

Я не думаю, что вы можете извлечь эту информацию с помощью INSERT IGNORE. Даже если текст предупреждения будет содержать значение ключа, существует очень много предупреждений в буфере, поэтому вы не можете на это полагаться.

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

SELECT id FROM tab WHERE name in ('...value1...',...,'...valueN...')

В зависимости от формата данных, которые вы хотите вставить, и от того, как вы выполняете вставки (объемные или по одной строке за раз), вы можете сделать несколько вещей, чтобы избежать вставки известных дубликатов.

Если, с другой стороны, у вас была идея извлечь идентификаторы потенциальных дубликатов, чтобы вместо этого выполнить обновление для этих строк, вам следует использовать синтаксис REPLACE (http://dev.mysql.com/doc/refman/5.1/en/replace.html) или ON DUPLICATE KEY UPDATE конструкция (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html)

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