【问题标题】:How to fix duplicate key error while SET in MySQL如何修复 MySQL 中 SET 时出现的重复键错误
【发布时间】:2020-12-16 18:37:40
【问题描述】:

我在一张桌子上做如下操作:

UPDATE tname
SET cname = cname + INTERVAL 8 HOUR;

在表中,cname 列用于时间戳并设置为主键。操作是将cname列的所有值加8小时。

但是由于重复键,操作收到错误消息。我不知道这到底是怎么发生的,但我猜是有一个列'cname',它的值间隔为 8 小时。 因此,当它尝试添加 8 小时并写入时,会出现重复键错误。

我有两个问题:

  1. 如果操作出错,是不是表不一致?我的意思是有些行是用 8 小时添加的,有些行不是?

  2. 如何完成此操作而不会出现重复键错误?

【问题讨论】:

  • 如果 cname 是主要的,它有一个隐式的唯一索引,因此如果存在另一个 cname + 8 小时的记录,你会得到这个错误。我会说更改主键是糟糕的表设计。

标签: mysql duplicates sql-update


【解决方案1】:

更新本身正在创建副本;根据处理行的顺序,您最终可能会得到一个与现有值冲突的新值。

一种常见的解决方法是使用order by

UPDATE tname
SET cname = cname + INTERVAL 8 HOUR
ORDER BY cname desc;

查询首先更新最大日期,然后按降序处理行,这样可以防止发生冲突。

【讨论】:

    【解决方案2】:
    1. 是的,除非您在事务中执行查询,并在出现错误时使用ROLLBACK;

    2. 您可以先检查是否有重复:

    UPDATE tname AS t
    JOIN (
        SELECT COUNT(*) AS count
        FROM tname AS t1
        JOIN tname AS t2 ON t1.cname = t2.cname + INTERVAL 8 HOUR) as dups
    SET t.cname = t.cname + INTERVAL 8 HOUR
    WHERE dups.count = 0
    

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 2011-01-05
      • 2020-12-16
      • 1970-01-01
      • 2019-07-11
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多