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を構成する4つの列が必要であり、FK制約は次のようになります。

ALTER TABLE dbo.YourOtherTable
ADD CONSTRAINT FK_YourOtherTable_CharacterSavingThrow
FOREIGN KEY(CharacterCode, FortitudeSaveCode, ReflexSaveCode, WilSaveCode)
REFERENCES dbo.CharacterSavingThrow(CharacterCode, FortitudeSaveCode, ReflexSaveCode, WilSaveCode)

重要なのは、複合主キー(複数の列で構成されている)がある場合、そのテーブルを参照する他のテーブルにもすべての列があり、FK関係にすべての列を使用する必要があるということです。

また、これら2つのテーブルを結合するクエリを作成する場合は、結合に複合PKに含まれるすべての列を使用する必要があります。

これは、PKとして4つの列を使用することの主な欠点の1つです。これにより、FK関係とJOINクエリが非常に面倒になり、作成して使用するのが非常に面倒になります。そのため、そのような場合、私はおそらくテーブルで別の代理INT IDENTITYキーを使用することを選択します-たとえば、テーブルに新しいものを導入しdbo.CharacterSavingThrowて主キーとして機能させると、そのテーブルを参照してJOINを作成するのがはるかに簡単になりますそのテーブルを使用するクエリ。

于 2012-04-16T05:51:52.053 に答える