2014-09-25 63 views
0

這是我的表1:不能創建外鍵「有被引用表中沒有主或候選鍵」

CREATE TABLE PurchasedProducts 
(
    Purchase_Order_No int, 
    Purchase_Product_ID int FOREIGN KEY REFERENCES Inventory(In_Product_ID), 
    Purchase_Quantity int NOT NULL, 
    Purchase_Status varchar(7) NOT NULL, 

    PRIMARY KEY(Purchase_Order_No, Purchase_Product_ID) 
); 

這是我的表2:

CREATE TABLE PurchasedDate 
(
    PD_PO_No int NOT NULL PRIMARY KEY FOREIGN KEY REFERENCES PurchasedProducts(Purchase_Order_No), 
    PD_Date date NOT NULL 
); 

我執行第一個表成功,但是當我執行第二個表時它顯示此錯誤消息:

被引用表中沒有主鍵或候選鍵「購買產品「與外鍵'FK__Purchased__PD_PO__0B5CAFEA'中的引用列表匹配。

我不是什麼問題。請幫幫我!

+2

很明顯,purchase_product_no列不是父表中的主鍵或唯一鍵, – radar 2014-09-25 02:20:11

+1

與您的問題無關,但這是一個非常奇怪的數據庫設計。更傳統的方法是將採購訂單表作爲其中一個字段。您的purchaseProducts表將具有對其的外鍵引用。順便說一句,你的答案在這裏。 http://stackoverflow.com/questions/6651667/creating-a-composite-foreign-key-in-sql-server-2008 – 2014-09-25 02:26:47

+0

@Rajesh你能告訴我這是什麼意思'PRIMARY KEY(Purchase_Order_No,Purchase_Product_ID)'。我希望Purchase_Order_No,Purchase_Product_ID作爲組合鍵。我想把PD_PO_No作爲Purchase_Order_No的外鍵。這對於我的任務,我是SQL新手請幫忙。 Thankyou – 2014-09-25 02:29:35

回答

2

PurchasedProducts表的主鍵是由兩列:

PRIMARY KEY(Purchase_Order_No, Purchase_Product_ID) 

這樣想引用必須具有以下確切的兩列所有子表:

CREATE TABLE PurchasedDate 
(
    PD_PO_No int NOT NULL PRIMARY KEY, 
    Purchase_Product_ID INT NOT NULL, 
    PD_Date date NOT NULL 
); 

ALTER TABLE dbo.PurchasedDate 
ADD CONSTRAINT FK_PurchaseDate_PurchasedProducts 
    FOREIGN KEY(PD_PO_No, Purchase_Product_ID) 
    REFERENCES PurchasedProducts(Purchase_Order_No, Purchase_Product_ID) 

A 外鍵只能引用整個父表的主鍵 - 你不能引用從父表中的PK中只有2列中有2列。

+0

非常感謝你解釋得很好 – 2014-09-25 07:39:10

+0

@kaviraj&marc_s:FOREIGN KEY可以引用任何NOT NULL UNIQUE或PRIMARY KEY列集。而這樣一個列集可以包含在更大的列。所以你可以引用PK的2列,只要它是NOT NULL UNIQUE。 SQL NOT NULL UNIQUE和PK實際聲明一個超級密鑰不一定是候選鍵,FK實際上聲明一個外部超級鍵不一定是外鍵。 – philipxy 2014-09-25 23:18:15

+0

@philipxy:表示同意 - 但是如果PK中的那一列已經是唯一的並且不爲空 - ***爲什麼***你有複合PK呢?在這種情況下,單個列將是PK的更好候選者...... – 2014-09-26 05:48:24