我有一张桌子
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。
感谢。
答案 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)。如果要删除某个维度,那么即使您尝试修改主键,您的约束也会告诉您无法删除给定的列,因此您应首先处理外键,然后您可以修改你的主键。步骤进行:
将所有外键写入列表,以便您知道以前哪些是外键。
删除所有引用主键的外键
修改/重新创建主键
根据新版主键重新创建外键。
答案 2 :(得分:0)
如果在其他表上删除FK是一个问题,那么您可以按顺序创建包含这些列的非聚集索引并提供提示(WITH INDEX(ALTER TABLE语法不会为ALTER CONSTRAINT
语句留下空间
答案 3 :(得分:0)
没有。在关系模型中,对键中的属性没有有意义的排序。但在SQL中,有。外键列与FK引用的主键或唯一键的列的对应关系是顺序位置,而不是名称。
因此,密钥声明中列的排序是有意义的,如果当前有效地使用了这种含义/排序,那么在不破坏当前用途的情况下就无法对其进行更改。
除了。该理论对关键属性/列的排序没有任何意义,并非没有道理。与现有密钥相比,您认为“重新订购”密钥对您来说“更好”到底是什么?