9

SQL Server 2005 の別の SQL テーブルへの外部キー参照として、SQL テーブルの一意の制約を追加する方法

4

5 に答える 5

11

FK制約を(子テーブルから親テーブルに)追加するには、関係の親テーブル列に一意性制約を追加する必要があります。
残りはすべてオプションであるか、FKとは何の関係もありません。

  • 主キーの義務的な必要性はありません
  • 子テーブル列に一意性は必要ありません

親テーブル(このようなFK関係)は主キーテーブルとして頻繁に呼び出されますが(SSMSを含む)、PKは必須ではなく、親テーブルの一意キー/制約で十分です(PKは一意であるため、親テーブル)。

初心者にはわかりにくいマットの回答からTableAとTableBを削除し、次の
ように再作成します。

CREATE TABLE parentB--TableB 
(
    PK1 INT NOT NULL,
    PK2 INT NOT NULL,
    --I would not have additional non-referenced data in parent table, 
    --rather in child table
    --SomeData VARCHAR(1000),

    --CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
)

CREATE TABLE childA--TableA 
(
    --PK INT, -- NOT NULL,
    FK1 INT-- NOT NULL,  -- Or NULL, if you''d rather.
    FK2 INT --NOT NULL --,
    , SomeData VARCHAR(1000)
    --CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
    --CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
    --CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
)

さて、FKを追加するために

ALTER TABLE childA 
ADD 
--constraint FK1_childA 
--this is optional, if one needs to add his own custom name
FOREIGN KEY (FK1) REFERENCES parentB(PK1); 

最初に、親テーブル列の対応する参照列に一意性制約を作成する必要があります。

ALTER TABLE parentB ADD 
--CONSTRAINT YourUniqueName --uncomment for adding your own name to constraint
UNIQUE(PK1) 

同様に、2列の外部キー制約の場合
(最初に、親テーブルに対応する一意の制約が必要です):

ALTER TABLE parentB ADD 
--CONSTRAINT YourUniqueName --for adding your own name to unique constraint
UNIQUE(PK1,PK2)  

ALTER TABLE childA 
ADD 
--constraint yourUniqueName --uncomment for adding your own name to FK constraint
FOREIGN KEY (FK1, FK2) REFERENCES parentB(PK1, PK2); 
于 2010-11-21T08:22:48.253 に答える
2

申し訳ありませんが、ここで何を求めているのかよくわかりません。テーブル定義の例をもっと挙げると役に立ちます! 「Cons2cols」という名前の一意の制約で TableA に 2 つの列があり、これら 2 つの列を TableB の 2 つの列 PK / unqiue ペアの FK にしたいと言っていると思います。

テーブルを最初から作成している場合、次のように機能します。

CREATE TABLE TableB (
    PK1 INT NOT NULL,
    PK2 INT NOT NULL,
    SomeData VARCHAR(1000),

    CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
)

CREATE TABLE TableA (
    PK INT NOT NULL,
    FK1 INT NOT NULL,  -- Or NULL, if you''d rather.
    FK2 INT NOT NULL,
    CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
    CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
    CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
)

テーブルが既に存在する場合は、事後にこれらの同じ制約を追加できます。

ALTER TABLE TableA ADD CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2);
ALTER TABLE TableA ADD CONSTRAINT Cons2cols UNIQUE(FK1, FK2);

いずれにせよ、TableA には、別のテーブルへの一意の 2 列の FK があります。

于 2010-11-19T14:09:03.480 に答える
1

列に FK を追加しても、その列に自動的にインデックスが作成されるわけではないことに注意してください。これは 2 つの手順で行う必要があります。

1) Make a column in your table a FK to a parent table.
2) Add a unique constraint on that same column
于 2010-11-19T12:41:55.640 に答える
0

ここでは、一意の制約については忘れてください。2 つの列に新しい外部キーを作成するだけです。

ALTER TABLE dbo.PurchaseDetail
ADD FOREIGN KEY (Customer, Product)
    REFERENCES dbo.Purchase (Customer, Product)
于 2010-11-21T09:17:55.777 に答える