1

所以,我有一个像这样创建的表:

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)

)

我需要知道如何从另一个表的约束中引用该表的主键?似乎是一个非常简单的问题,有没有可能,对吧?谢谢你们的帮助!

4

1 回答 1

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变得更加容易使用该表的查询。

于 2012-04-16T05:51:52.053 回答