如何在MySQL中进行SET修复重复键错误

问题描述

我在桌子上做了以下操作:

UPDATE tname
SET cname = cname + INTERVAL 8 HOUR;

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

但是由于键重复,该操作收到一条错误消息。我不知道这将如何发生,但我想是有列“ cname”,其值间隔为8小时。 因此,当它尝试添加并写入8小时时,就会得到重复的密钥错误

我有两个问题:

  1. 如果操作出错,则表是否不一致?我的意思是有些行需要8小时才能添加,有些行却没有?

  2. 如何在没有重复键错误的情况下完成此操作?

解决方法

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

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

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

查询从更新最大日期开始,然后以降序处理行,从而防止发生冲突。

,
  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