2013-07-26 49 views
29

在SQL Server相匹配的是,我得到這個錯誤 - >有在引用表上沒有主或候選鍵的引用列列表中的外鍵

「裏有沒有主或候選鍵參考表 'BookTitle'與外鍵中的引用列表匹配 'FK_ BookCopy _Title__2F10007B'。「

我首先創建了一個關係,稱爲BookTitle關係。

CREATE TABLE BookTitle (
ISBN   CHAR(17)  NOT NULL, 
Title   VARCHAR(100) NOT NULL, 
Author_Name  VARCHAR(30) NOT NULL, 
Publisher  VARCHAR(30) NOT NULL, 
Genre   VARCHAR(20) NOT NULL, 
Language  CHAR(3)  NOT NULL,  
PRIMARY KEY (ISBN, Title)) 

然後我創建了一個叫做BookCopy關係的關係。這種關係需要參考BookTitle關係的主鍵,Title

CREATE TABLE BookCopy (
CopyNumber   CHAR(10)   NOT NULL, 
Title    VARCHAR(100)  NOT NULL, 
Date_Purchased  DATE    NOT NULL, 
Amount    DECIMAL(5, 2)  NOT NULL, 
PRIMARY KEY (CopyNumber), 
FOREIGN KEY (Title) REFERENCES BookTitle(Title)) 

但是我無法創建BookCopy關係,因爲出現上述錯誤。

我真的很感謝一些有用的幫助。

+1

你有表格中的數據嗎? – Bharadwaj

+0

[在被引用表中沒有主鍵或候選鍵]可能有重複(https://stackoverflow.com/questions/12213301/there-are-no-primary-or-candidate-keys-in-the-referenced-表) –

回答

38

外鍵通過將列連接到另一個表中的唯一鍵來工作,並且該唯一鍵必須定義爲某種形式的唯一索引,無論是主鍵還是某個其他唯一索引。

目前,唯一的唯一索引是ISBN, Title上的複合索引,它是您的主鍵。

您可以選擇多種選項,具體取決於BookTitle的內容和數據之間的關係。

我會冒險猜測ISBN是BookTitle中每一行唯一的。假設情況是這樣的,那麼將您的主鍵更改爲只能使用ISBN,並更改BookCopy,以便您不使用Title而使用ISBN並加入。

如果您需要將主鍵保留爲ISBN, Title那麼您需要將ISBN存儲在BookCopy中以及標題和外鍵上,或者您需要在BookTitle(標題)上創建唯一索引,作爲一個獨特的指標。

更一般地說,您需要確保REFERENCES子句中的一列或多列與父表中的唯一索引完全匹配:在您的情況下,它失敗了,因爲您沒有單獨的唯一索引Title

+0

原因是因爲當你有一個外鍵時,它不應該掃描目標表來使關係正確? – HumbleWebDev

+0

不,這是因爲外鍵在概念上總是映射到父表中的單個行。這是通過在許多RDBMS上作爲索引實現的表上的唯一約束來實施的。但它不一定是。 –

+0

對,我認爲這是一個更好,更簡單的解釋。 – HumbleWebDev

6

您需要用

  • 在BOOKTITLE了標題唯一索引
  • 在BookCopy和FK
  • 的ISBN列在兩列

的外鍵的需要來唯一地標識父行:你目前沒有辦法做到這一點,因爲標題不是唯一的。

2

BookTitle有一個複合鍵。所以如果BookTitle的密鑰被引用爲foreign key,則必須帶上完整的組合密鑰。

因此,要解決該問題,您需要在BookCopy中添加完整的組合鍵。因此,請添加ISBN列。他們在最後。

foreign key (ISBN, Title) references BookTitle (ISBN, Title) 
9

另一件事是 - 如果你的密鑰是非常複雜的,有時你需要更換場的地方,它可以幫助:

如果dosent工作:

外鍵(ISBN,書名)引用BOOKTITLE(ISBN,標題)

然後這可能工作(不是這個具體的例子,但在一般):

外鍵(書名,ISBN)refe rences BookTitle(標題,ISBN)

+3

謝謝!我終於過去了那個愚蠢的錯誤。 [索引中列的順序有多重要?](https://stackoverflow.com/questions/2292662/how-important-is-the-order-of-columns-in-indexes)解釋了爲什麼順序很重要。 – Darsstar

相關問題