重新排序复合主键的组成

时间:2012-09-05 09:39:46

标签: sql sql-server database-design composite-primary-key primary-key-design

我有一张桌子

documents
(
    year int not null, 
    number int not null, 
    document_types_id int not null, 
    ...
)

主键是年份+号码+ document_types_id。

我认为更好的主键是year + document_types_id + number。有没有办法重新排序这个组合(不是表中的列,PK和FK组合)而不删除和重新创建PK,因为这个PK在许多其他表中用作FK。

感谢。

4 个答案:

答案 0 :(得分:1)

您必须先删除主键以便稍后更改它。否则,您会收到一条消息,即一个表上不能有两个主键。

但是这没问题,只需做

Alter Table myTable NOCHECK Constraint All

然后根据需要更改表格,然后执行

Alter Table myTable CHECK Constraint ALL

你没事。

MySQL中的等价物是:

SET FOREIGN_KEY_CHECKS = 0;

SET FOREIGN_KEY_CHECKS = 1;

答案 1 :(得分:1)

您的外键引用了您的主键,因此外键是3维的(年份+数字+ document_types_id)。如果要删除某个维度,那么即使您尝试修改主键,您的约束也会告诉您无法删除给定的列,因此您应首先处理外键,然后您可以修改你的主键。步骤进行:

  1. 将所有外键写入列表,以便您知道以前哪些是外键。

  2. 删除所有引用主键的外键

  3. 修改/重新创建主键

  4. 根据新版主键重新创建外键。

答案 2 :(得分:0)

如果在其他表上删除FK是一个问题,那么您可以按顺序创建包含这些列的非聚集索引并提供提示(WITH INDEX(ALTER TABLE语法不会为ALTER CONSTRAINT语句留下空间

答案 3 :(得分:0)

没有。在关系模型中,对键中的属性没有有意义的排序。但在SQL中,有。外键列与FK引用的主键或唯一键的列的对应关系是顺序位置,而不是名称。

因此,密钥声明中列的排序是有意义的,如果当前有效地使用了这种含义/排序,那么在不破坏当前用途的情况下就无法对其进行更改。

除了。该理论对关键属性/列的排序没有任何意义,并非没有道理。与现有密钥相比,您认为“重新订购”密钥对您来说“更好”到底是什么?