SQL Server复合主键

时间:2010-05-13 17:08:07

标签: sql sql-server-2008 primary-key

我正在尝试替换某个表中的给定日的所有记录。该表具有由7个字段组成的复合主键。一个这样的领域是日期。

我删除了所有日期值为2/8/2010的记录。当我尝试将记录插入到2010年2月8日的表中时,我得到主键违规。我试图插入的记录仅适用于2010年2月8日。

由于日期是PK的一个组成部分,只要我插入的日期不在表格中,就不应该违反约束吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可能在要插入的数据中有重复项。

此外,拥有一个由7个字段组成的主键是一种非常非常非常糟糕的做法。处理此问题的正确方法是在七个字段上具有代理身份密钥和唯一索引。加入7个领域的子桌子可以保证性能不佳,并且当有子记录变成噩梦并且可以完全锁定你的系统时更新记录。主键应该是唯一的adnit应该永远不会改变。

答案 1 :(得分:2)

所有行在该字段中是否只有一个日期组件(即时间总是设置为午夜:00:00:00)?如果没有,您需要删除行> = 2/8/2010和< 2010/2/9。

另外,你确定你没有意外地尝试插入两个具有相同日期的记录(其他6个PK字段中的值相同)吗?

答案 2 :(得分:0)

也许这里发生了一些你不知道的事情。当您插入行并获得主键冲突时,尝试使用无法插入的行中的相应键值执行SELECT(当然,在执行ROLLBACK之后)并查看您获得的内容。或者,表中有一个触发器,您要插入的数据将行插入另一个使用相同主键但未清除的表中。

您可以尝试以下SELECT来查看结果:

SELECT *   来自你的时间   在哪里日期> 2/7/2010 AND         日期< 2010/2/9;

(不确定SQL Server中日期常量的正确格式,因为我在几年内没有使用它,但我相信你明白了)。看看你得到了什么。

祝你好运。