【问题标题】:SQL UPDATE or DELETE if duplicateSQL UPDATE 或 DELETE(如果重复)
【发布时间】:2015-09-08 08:24:48
【问题描述】:

我正在尝试在我的数据库中运行 3 个查询:

UPDATE `table` SET `rubriq` = '77' WHERE `rubriq` = '61';
UPDATE `table` SET `rubriq` = '77' WHERE `rubriq` = '62';
UPDATE `table` SET `rubriq` = '77' WHERE `rubriq` = '63';

table 中,我有两列abonnerubriq。 Abonne是主键,两个是索引。

如果在我的数据库中有例如:

 abonne  | rubriq  
  84     |   61  
  84     |   62 
  84     |   63

当我运行 3 个查询时,第一个没有问题,但第二个,我有一个错误:#1062 - Duplicate entry '84-77' for key 1

我该如何运行这 3 个查询,但是,当出现这样的错误时,只需删除该行?

谢谢!

【问题讨论】:

  • 也许你的rubriq 列是主键。请检查。而且,您的 rubriq 中只有 1 列?
  • 请提供表的结构及其键。另请检查唯一索引。
  • 您的表包含唯一键,其中列 abonnerubriq 显示 Duplicate Entry 的错误
  • abonne为主键,两列为索引
  • 当你说“just remove the line”时,你的意思是要从表中删除重复记录还是要从执行中删除命令列表?如果是前者,我们假设保存冲突值的第一个记录并删除所有其他记录是否正确?如果是后者,我们是否正确假设该命令仍应针对所有其他(非冲突)记录执行?

标签: mysql


【解决方案1】:

您必须手动删除会导致冲突的记录:

UPDATE `table` SET rubriq = 77 WHERE rubriq = 61;

DELETE t62
FROM   `table` t77
  JOIN `table` t62 USING (abonne)
WHERE  t77.rubriq = 77
   AND t62.rubriq = 62;

UPDATE `table` SET rubriq = 77 WHERE rubriq = 62;

DELETE t63
FROM   `table` t77
  JOIN `table` t63 USING (abonne)
WHERE  t77.rubriq = 77
   AND t63.rubriq = 63;

UPDATE `table` SET rubriq = 77 WHERE rubriq = 63;

【讨论】:

    【解决方案2】:

    这可能与 eggyal 所做的相同,但他们的版本太复杂了,我无法理解。这就是我在类似情况下所做的。

    UPDATE OR IGNORE table SET rubriq = 77 WHERE rubriq = 61;
    DELETE FROM table WHERE rubriq = 61;
    
    UPDATE OR IGNORE table SET rubriq = 77 WHERE rubriq = 62;
    DELETE FROM table WHERE rubriq = 62;
    
    UPDATE OR IGNORE table SET rubriq = 77 WHERE rubriq = 63;
    DELETE FROM table WHERE rubriq = 63;
    

    基本上,如果存在重复项,则忽略它。然后在更新之后,删除所有剩余的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多