【问题标题】:SQL Server Composite Primary KeysSQL Server 复合主键
【发布时间】:2010-05-13 17:08:06
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    此外,拥有一个由 7 个字段组成的主键是一种非常、非常、非常糟糕的做法。处理这个问题的正确方法是在七个字段上有一个代理标识键和一个唯一索引。加入 7 个字段上的子表是性能不佳的保证,当它们有子记录时更新记录成为一场噩梦,并且可以完全锁定您的系统。主键应该是唯一的,并且永远不会改变。

    【讨论】:

    • 谢谢。我知道桌子设计中的缺陷,但不幸的是,我不能改变,只是让它发挥作用。
    • 另外,你是对的!我必须将记录双重加载到另一个没有 PK 的表中。再次感谢。
    • 大声笑,如果不是我自己做一两次,你认为我怎么会这么快就知道答案。
    • 有点跑题了,但是主键应该“永不改变”的想法从何而来?通常希望拥有不更改的键,但没有根本原因为什么键不应该/不能比任何其他属性更改更多。有时更改键值很有用。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      也许这里发生了一些你不知道的事情。当您插入一行并获得主键违规时,请尝试使用无法插入的行中的适当键值执行 SELECT(当然,在执行 ROLLBACK 之后)并查看您得到了什么。或者,您要向其中插入数据的表上可能有一个触发器,该触发器正在将行插入另一个使用相同主键但未清除的表中。

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

      选择 * FROM YOUR_TABLE 日期 > 2/7/2010 和 日期

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

      祝你好运。

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2012-03-21
        • 1970-01-01
        • 2014-08-24
        • 2011-04-24
        相关资源
        最近更新 更多