所以,我有一个像这样创建的表:
create table CharacterSavingThrow
(
CharacterCode int not null,
constraint FK_CharacterSavingThrowCharacterID foreign key (CharacterCode) references Character(CharacterCode),
FortitudeSaveCode int not null,
constraint FK_CharacterSavingThrowFortitudeSaveCode foreign key (FortitudeSaveCode) references SavingThrow(SavingThrowCode),
ReflexSaveCode int not null,
constraint FK_CharacterSavingThrowReflexSaveCode foreign key (ReflexSaveCode) references SavingThrow(SavingThrowCode),
WillSaveCode int not null,
constraint FK_CharacterSavingThrowWillSaveCode foreign key (WillSaveCode) references SavingThrow(SavingThrowCode),
constraint PK_CharacterSavingThrow primary key clustered (CharacterCode, FortitudeSaveCode, ReflexSaveCode, WilSaveCode)
)
我需要知道如何从另一个表的约束中引用该表的主键?看起来像一个非常简单的问题,无论是否可能,对吧?谢谢你们的帮助!
答案 0 :(得分:1)
是 - 非常简单 - 您只需指定完整的复合索引,例如你的另一个表也需要在这里构成PK的那四列,然后FK约束将是:
ALTER TABLE dbo.YourOtherTable
ADD CONSTRAINT FK_YourOtherTable_CharacterSavingThrow
FOREIGN KEY(CharacterCode, FortitudeSaveCode, ReflexSaveCode, WilSaveCode)
REFERENCES dbo.CharacterSavingThrow(CharacterCode, FortitudeSaveCode, ReflexSaveCode, WilSaveCode)
关键是:如果您有一个复合主键(由多个列组成),那么任何其他想要引用该表的表也必须包含所有这些列并使用所有这些列为FK关系。
另外,如果您正在编写将加入这两个表的查询 - 您必须使用复合PK中包含的所有列来进行连接。
这是使用四列作为PK的主要缺点之一 - 它使得FK关系和JOIN查询非常麻烦,并且编写和使用非常烦人。出于这个原因,在这种情况下,我可能会选择在表格中使用单独的代理键 - 例如在INT IDENTITY
表上引入一个新的dbo.CharacterSavingThrow
作为主键,这将使更容易引用该表并编写使用该表的JOIN查询。< / p>