Игнорировать ошибку дублирующегося ключа в MySQL на INSERT - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь скопировать строку в моей таблице в другую таблицу. Там запрос выглядит так

INSERT INTO `quote_block_arc` (`id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends`) SELECT `id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends` FROM `quote_block` WHERE `quote_id` = '41'

Однако, если не удалось сохранить дубликат ключа для этой строки, есть ли способ игнорировать это предупреждение и выполнить запрос?

Ответы [ 5 ]

3 голосов
/ 11 июля 2011

Вы можете выполнить INSERT IGNORE или INSERT ... ON DUPLICATE KEY UPDATE Другой способ - проверить результат запроса, если он ложный - проверить ошибку и, если код ошибки 1062 (повторяющаяся запись), продолжить выполнение, как если быбез ошибок.

3 голосов
/ 11 июля 2011

Эта ошибка возникает из-за того, что вы указали один из столбцов таблицы как UNIQUE.Вы не можете иметь 2 строки с одинаковым значением для этого столбца.Если вы хотите заменить существующую строку, используйте REPLACE вместо INSERT.Если вам действительно нужны строки, содержащие одно и то же значение для столбца, удалите модификатор UNIQUE из этого столбца.

Использование INSERT IGNORE, как описано в некоторых других ответах, предотвратит ошибку, ноне обновлять таблицу.

2 голосов
/ 11 июля 2011

попробуй

INSERT IGNORE INTO `quote_block_arc` (`id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends`) SELECT `id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends` FROM `quote_block` WHERE `quote_id` = '41'
1 голос
/ 11 июля 2011

Наличие дублирующейся строки в таблице с уникальным / основным ограничением нарушит ее целостность.Вы должны проверить, что это за ключ, и подтвердить, действительно ли вам нужно его скопировать.Например, первичные ключи AUTO_INCREMENT традиционно не вставляются, потому что база данных заполнит их для вас автоматически.Я бы проверил таблицу назначения quote_block_arc, если id - AUTO_INCREMENT.Если это так, удалите его из INSERT и позвольте MySQL вставить его самостоятельно.

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

0 голосов
/ 11 июля 2011

@ cmmi - у меня нет дубликатов, я вставляю данные из одной таблицы в другую.

Я рекомендую получить наивысший id из цели quote_block_arc, затем вы добавляете это к id в своем подзапросе SELECT.Таким образом, вы знаете, как обновить любые другие связанные записи в других таблицах, которые ссылаются на эти строки.Если бы вы позволили СУБД назначить для вас новые id s, все отношения были бы потеряны.

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