我正在尝试将表格中的一行复制到另一个表格中。查询看起来像这样
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'
但是,它保存失败,此行有一个重复的键,有没有办法忽略该警告并运行查询?
答案 0 :(得分:3)
您可以执行INSERT IGNORE
或INSERT ... 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
,则所有关系都将丢失。