【问题标题】:Need explanation for Cannot insert duplicate key row in object error需要解释无法在对象错误中插入重复的键行
【发布时间】:2013-10-10 13:15:55
【问题描述】:

我在做:

SELECT uid, intStatus from dbo.MYTABLE 
WHERE 
intStatus = 10 and uid = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'

我得到:

        uid                            |  intStatus 
-------------------------------------- +---------------
'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1  | 10

然后我需要进行更新,我需要该 uid 的 intStatus 为 18。所以我这样做:

UPDATE dbo.MYTABLE  SET intStatus = 18 
WHERE 
intStatus = 10 and uid = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'

这是我得到错误的地方:

无法在具有唯一索引“ixMYTABLE”的对象“dbo.MYTABLE”中插入重复的键行。

谁能告诉我为什么会出现这个错误?我该如何解决?

uid 是 MYTABLE 的主键

intStatus 是一个非空整数

非常感谢!

【问题讨论】:

  • 您的数据库设计中存在不允许该表中 intStatus 重复值的内容,并且还有另一条值为 18 的记录。解决它的方法是找出不允许重复的原因.可能有一个很好的理由。然后你必须重新审视你想要完成的事情。
  • 错误状态为 ixMYTABLE 唯一索引。这个唯一索引的组成是什么?
  • uid 是 uniqueidentifier 主键不为空且 intStatus 是 int 不为空
  • 你能发布创建表的脚本吗?请同时包含索引和约束创建。
  • 这个问题解决了吗?我遇到了同样的问题,我无法缩小到我的 PK 被复制的位置

标签: sql sql-update key duplicates uniqueidentifier


【解决方案1】:

可能您已经有一行 intStatus 18 和 uid 'a1a1...'

尝试运行并查看您是否已经拥有尝试使用 UPDATE 创建的行:

SELECT uid, 
       intStatus 
  FROM dbo.MYTABLE 
 WHERE intStatus = 18 
   AND uid = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'

【讨论】:

  • 没有 intStatus 18 和 uid 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1' 的行
  • 如果 uid 是键,即使使用更新,也不能有重复值。唯一键意味着任何时候只有一行具有给定值。
【解决方案2】:

如果 uid 是您的主键,那么根据定义它是唯一的,因此 intStatus 条件无关紧要。这应该有效:

UPDATE dbo.MYTABLE  SET intStatus = 18 
WHERE  uid = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1';

如果这不起作用,那么您可以使用一个组合键来组合两列而不是单个列键。

Info on primary keys and composites

【讨论】:

    【解决方案3】:

    intStatus 是唯一的 这就是mysql抛出错误的原因。

    如果你想执行那个查询 intStatus 不应该是唯一的

    【讨论】:

    • intStatus 是一个不为空的 int
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2020-11-27
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多