2010-11-19 27 views

回答

0

您需要請記住,在列上添加FK不會自動在該列上放置索引。你需要分兩步做。

1) Make a column in your table a FK to a parent table. 
2) Add a unique constraint on that same column 
+0

但我有兩個cols添加到唯一約束「Cons2cols」。我想把這個「Cons2cols」作爲外鍵映射到表 – subash 2010-11-19 13:25:53

+1

對不起,我不太明白你在問什麼或者說什麼。 – 2010-11-19 13:45:26

1

道歉,但我不確定你在問什麼。給表格定義更多的例子會有所幫助!我想認爲你說你在TableA中有一個名爲「Cons2cols」的唯一約束中有兩列,而且你還希望這兩列是TableB中兩列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到另一個表。

8

爲了添加FK約束(在子表中父表中)你必須添加唯一約束父表關係的列表。
其餘全是可選的或無關與FK:

  • 的任何主鍵
  • 沒有在子表colums

需要獨特性(一個或多個)的母公司沒有強制性的需要表(在這種FK關係中)經常被稱爲(包括通過SSMS)作爲主鍵表,但是PK不是必須的,父表中的唯一鍵/約束是足夠的(因爲PK是唯一的,它是父表中唯一約束的特殊情況)。

刪除表A和表B從answer by Matt,這是混淆對於初學者來說,
並重新創建它們作爲

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); 
0

忘掉唯一約束現在。只需在兩列上創建新的外鍵。

ALTER TABLE dbo.PurchaseDetail 
ADD FOREIGN KEY (Customer, Product) 
    REFERENCES dbo.Purchase (Customer, Product) 
相關問題