在MySQL中设置时如何修复重复密钥错误

在MySQL中设置时如何修复重复密钥错误,mysql,duplicates,sql-update,Mysql,Duplicates,Sql Update,我在一张桌子上做了以下操作: UPDATE tname SET cname = cname + INTERVAL 8 HOUR; 在表中,cname列表示时间戳,并设置为主键。操作是将cname列的所有值加上8小时 但由于密钥重复,操作会收到错误消息。我不知道这到底是怎么发生的,但我猜有一列“cname”,它的值间隔为8小时。 因此,当它尝试添加8个小时并写入时,会出现重复密钥错误 我有两个问题: 如果操作出错,表是否不一致?我的意思是有些行加了8小时,有些行没有 如何在没有重复密钥错误的情

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

UPDATE tname
SET cname = cname + INTERVAL 8 HOUR;
在表中,cname列表示时间戳,并设置为主键。操作是将cname列的所有值加上8小时

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

我有两个问题:

  • 如果操作出错,表是否不一致?我的意思是有些行加了8小时,有些行没有

  • 如何在没有重复密钥错误的情况下完成此操作

  • 是,除非您在事务中执行查询,并使用
    ROLLBACK如果有错误

  • 您可以先检查是否存在任何重复项:


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

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

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

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

    如果cname是主要的,则它有一个隐式唯一索引,因此如果存在另一条cname+8小时的记录,则会出现此错误。我认为更改主键是不好的表设计。
    UPDATE tname
    SET cname = cname + INTERVAL 8 HOUR
    ORDER BY cname desc;