【问题标题】:Ignore duplicate key error in MySQL on INSERT在 INSERT 上忽略 MySQL 中的重复键错误
【发布时间】:2011-07-11 09:35:41
【问题描述】:

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

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'

但是,保存此行的重复键失败,有没有办法忽略该警告并运行查询?

【问题讨论】:

  • 为什么要在表中使用重复键?如果您不使用唯一键删除模式中的约束。如果您需要唯一键,则不需要重复键。
  • @cmmi - 我没有重复,我将数据从一个表插入到另一个表中。

标签: php mysql key


【解决方案1】:

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

使用INSERT IGNORE 如其他一些答案中所述,将防止发出错误,但不会更新表。

【讨论】:

  • 我研究了 REPLACE,它运行良好。但是,有时我需要使用 REPLACE,而其他时候我需要 INSERT,有没有办法做“REPLACE OR INSERT INTO”?
【解决方案2】:

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

【讨论】:

  • 您能否在第二部分中多解释一下,您是说在插入之前通过 select 手动检查每个键吗?
【解决方案3】:

试试

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'

【讨论】:

  • 如果出现重复键错误,这将添加条目。
【解决方案4】:

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

使用INSERT IGNORE 将导致您的行被插入。如果要覆盖重复键,请使用REPLACE,但我不建议使用我之前描述的方法。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多