在INSERT上忽略MySQL中的重复键错误

时间:2011-07-11 09:35:42

标签: php mysql key

我正在尝试将表格中的一行复制到另一个表格中。查询看起来像这样

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 个答案:

答案 0 :(得分:3)

您可以执行INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE 另一种方法是检查查询结果,如果它是错误的 - 检查错误,如果错误代码是1062(重复条目)继续执行,就像没有错误一样。

答案 1 :(得分:3)

发生此错误是因为您已将表的一列指定为UNIQUE。此列不能包含2个具有相同值的行。如果您要替换现有行,请使用REPLACE代替INSERT。如果您确实希望列包含相同的值,请从该列中删除UNIQUE修饰符。

如某些其他答案所述,使用INSERT IGNORE可以防止发出错误,但不会更新表格。

答案 2 :(得分:2)

尝试

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'

答案 3 :(得分:1)

在具有唯一/主要约束的表中具有重复行会违反其完整性。您应该检查密钥是什么,并确认您是否确实需要复制密钥。例如,传统上不会插入AUTO_INCREMENT主键,因为数据库会自动为您填充。如果quote_block_arc是AUTO_INCREMENT,我会检查目标表id。如果是,请将其从INSERT中删除,然后让MySQL自行插入。

使用INSERT IGNORE会导致您的行被插入。如果要覆盖重复密钥,请使用REPLACE,但我不推荐使用我之前描述的方法。

答案 4 :(得分:0)

  

@cmmi - 我没有重复项,我正在将数据从1个表插入到另一个表中。

我建议您从目标id获取highest quote_block_arc,然后将其添加到id子查询中的SELECT。这样,您就知道如何更新引用这些行的其他表中的任何其他相关条目。如果您让RDBMS为您分配新的id,则所有关系都将丢失。