【问题标题】:Primary Key Duplication Exception主键重复异常
【发布时间】:2012-06-19 18:31:16
【问题描述】:

我正在使用 sql server 作为数据库的 C# 项目。所以问题是我的项目中有一个算法每次都返回一个值;保存到数据库中(作为我的项目要求)。如果算法重复一个值,那也会保存到不需要的数据库(重复)并导致一些问题。我需要帮助来克服唯一值在发生时只保存一次的问题;数据库中没有重复。我试图将该列设为主键,但后来发现主键违规异常。

【问题讨论】:

  • 发布用于将值保存到数据库的代码。然后我们可以根据您的需要进行更改。例如仅在值不存在时插入,和/或确认值是否已插入或值已存在。

标签: c# sql sql-server c#-4.0 exception-handling


【解决方案1】:

只需在行内或在存储过程中使用 EXISTS 查询

您的查询过程可以检查该行是否已经存在

编辑:啊哈抱歉忘了NOT,那太愚蠢了:D

IF NOT EXISTS(SELECT UniqueValue FROM UniqueValuesTable WHERE UniqueValue = @NewValue)
  INSERT INTO UniqueValuesTable VALUES (@NewValue)

编辑:这里有一个 SQL fiddle 来展示它的工作原理

http://sqlfiddle.com/#!3/b87f9/3

正如 dems 所指出的,该操作不是原子操作,因此在多会话情况下仍然可能存在 PK 违规

替代方案是:

INSERT INTO UniqueValuesTable SELECT @NewValue WHERE NOT EXISTS (SELECT UniqueValue FROM UniqueValuesTable WHERE UniqueValue = @NewValue)

【讨论】:

  • 我没有从表中选择值,而是将值从算法插入到数据库中。
  • 是的,这就是这个查询所做的 - 检查值是否已经存在,如果不存在,则插入它
  • INSERT INTO damidata ("+subject+") VALUES ('" + d[i].ToString() + "') 这个查询 damidata 是表名 ("+subject+") 它是一个可验证的其中包含列名和 ('" + d[i].ToString() + "') 这些是来自算法的值。
  • 好的,我已经编辑了将链接添加到 SQL 小提琴 - 看看,它显示查询工作。您可以注释掉第三个 INSERT 以查看它因主键违规而失败。
  • 不是线程安全的。另一个会话可以IFINSERT 之间插入一个值。会推荐INSERT INTO table SELECT @var WHERE NOT EXISTS ()
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多