2010-05-13 78 views
0

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

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

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

在此先感谢。

回答

2

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

此外,拥有由7个字段组成的主键是非常非常非常差的做法。处理这个问题的正确方法是在七个字段上有一个替代身份密钥和唯一索引。加入7个表格的子表是保证表现不佳并更新记录,当他们将子记录变成恶梦时,可以完全锁定系统。主键应该是唯一的,不应该改变。

+0

谢谢。我意识到桌子设计中的缺陷,但不幸的是,我不能改变它,只是为了让它工作。 – Colin 2010-05-13 17:20:55

+0

另外,你是对的!我必须将双重记录加载到另一张没有PK的表格中。再次感谢。 – Colin 2010-05-13 17:35:25

+1

大声笑,如果我一两次没有自己做过,你觉得我如此快地知道答案。 – HLGEM 2010-05-13 18:04:29

2

是否所有行在该字段中只有日期组件(即时间始终设置为午夜:00:00:00)?如果不是,则需要删除> = 2010年2月8日和2010年2月9日的行。

此外,你确定你不是不小心试图插入两个记录与相同的日期(和在其他6个PK领域相同的值)?

0

也许有什么事在这里你不知道。当你插入一行并得到一个主键违例时,试着用无法插入的行的适当键值(当然是在做一次ROLLBACK之后)尝试做一个SELECT并且看看你得到了什么。或者,也许在表格中有一个触发器,您要插入的数据将行插入到使用相同主键但未清除的另一个表中。

你可以尝试下面的SELECT看到什么变成了:

SELECT * FROM YOUR_TABLE 其中date> 2010年2月7日和 日期< 2010/2/9;

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

祝你好运。