问题描述
我在桌子上做了以下操作:
UPDATE tname
SET cname = cname + INTERVAL 8 HOUR;
在表中,cname列用于时间戳记,并设置为主键。该操作是将8小时添加到cname列的所有值中。
但是由于键重复,该操作收到一条错误消息。我不知道这将如何发生,但我想是有列“ cname”,其值间隔为8小时。 因此,当它尝试添加并写入8小时时,就会得到重复的密钥错误。
我有两个问题:
解决方法
更新本身正在创建重复项;根据行的处理顺序,您可能会得到一个与现有值冲突的新值。
常见的解决方法是使用order by
:
UPDATE tname
SET cname = cname + INTERVAL 8 HOUR
ORDER BY cname desc;
查询从更新最大日期开始,然后以降序处理行,从而防止发生冲突。
,-
是的,除非您在事务中执行查询,否则在出现错误时使用
ROLLBACK;
。 -
您可以先检查是否存在重复项:
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