【问题标题】:Cannot insert duplicate key row in object 'dbo.TitleClient' with unique index 'XAK1TitleClient'无法在具有唯一索引“XAK1TitleClient”的对象“dbo.TitleClient”中插入重复的键行
【发布时间】:2014-06-26 00:42:10
【问题描述】:

自从我清理了 SQL 数据库上的数据后,我就遇到了这个问题,而在不干净的数据库上,这个问题就没有发生。当我运行我的存储过程(巨大的过程)它返回:

General SQL error. Cannot insert duplicate key row in object 'dbo.TitleClient' with unique index 'XAK1TitleClient'. Cannot insert the value NULL into column 'id_title', table 'Database.dbo.TitleCom'; column does not allow null, insert fails.

是否有可能我从表中删除了导致这种情况的数据?还是那不可能?

【问题讨论】:

  • 你能详细说明“清理”吗?
  • 您的插入语句可能包含您“清理”的表中的值。与 LEFT OUTER JOIN 相结合,您将获得 NULL ,您曾经获得一个值。

标签: sql sql-server


【解决方案1】:

dbo.TitleClient 有标识列吗?您可能需要运行

DBCC CHECKIDENT('dbo.TitleClient')

我猜是第一条消息

无法在其中插入重复的键行 具有唯一性的对象“dbo.TitleClient” 索引“XAK1TitleClient”

是因为种子值与现有表值不同步,第二条错误信息

无法将值 NULL 插入 列“id_title”,表 'Database.dbo.TitleCom' 列确实 不允许为空,插入失败。

来自于尝试从第一条语句插入 scope_identity 的结果失败。

【讨论】:

  • DBBC CHECKIDENT('TitleClient') 返回此消息:检查身份信息:当前身份值“34566”,当前列值“34566”。 DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。
  • @John - 如果您尝试存储过程会怎样? (如果 问题,那么失败的插入必须将其恢复到正确的值)如果您仍然遇到问题,我们将需要更多关于 unique index 'XAK1TitleClient' 的详细信息以及它是如何获得其价值的。
  • 老实说,我什至不知道在管理工作室中在哪里可视化该唯一索引。我是 SQL 的初学者..
  • @John - 在 Management Studio 中,您可以右键单击表格并编写 CREATE 语句的脚本并将其添加到您的问题中。同时扩展索引并编写XAK1TitleClient的定义脚本
【解决方案2】:

您“清理”数据的干净程度如何?

  • 如果某些表仍有数据,则可能会导致问题。
  • 尤其是当您有触发器导致进一步插入时。

供您进一步调查。

  • 获取存储过程的主体,并逐位运行。
  • 最终,您将看到产生错误的实际语句。
  • 当然,如果此时您没有插入dbo.TitleClient,那么它肯定是引发问题的触发器。
  • 无论哪种方式:现在您可以轻松地检查之前插入 proc 的数据以找出根本原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多