2017-09-03 522 views
1

我有兩個表。一個叫BooksRead,一個叫作作者。作者的主鍵是author_last_name和author_first_name。無法添加SQL外鍵約束

我正在使用Netbeans IDE。

我想改變表BooksRead,它也有列author_last_name和author_first_name,引用作爲外鍵的作者。

ALTER TABLE BooksRead 
ADD FOREIGN KEY(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME) 
REFERENCES AUTHORS(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME); 

我試圖做到這一點許多不同的方式 - 包括添加/命名的約束 - 但總是得到同樣的錯誤:

[Exception, Error code 30,000, SQLState X0Y45] Foreign key constraint 'SQL170903182055780' cannot be added to or enabled on table BOOKSREAD because one or more foreign keys do not have matching referenced keys.

+1

您正在使用哪些DBMS?是德比嗎? – Phil

+1

此外,聽起來就像您的'BooksRead'表中有違反外鍵約束的數據,即'作者' – Phil

+0

Java DB,Apache Derby中沒有匹配的記錄。 – beh1

回答

0

您就要檢查一下是否對現有數據子表,作爲主鍵在父級上存在

1

聽起來像您的BooksRead表的數據違反了外鍵約束,即Authors中沒有匹配的記錄。

查找和添加約束

SELECT br.* 
FROM BooksRead br 
WHERE NOT EXISTS (
    SELECT 1 FROM AUTHORS a 
    WHERE a.AUTHOR_LAST_NAME = br.AUTHOR_LAST_NAME 
    AND a.AUTHOR_FIRST_NAME = br.AUTHOR_FIRST_NAME 
) 

這會給你的不具有匹配AUTHORBooksRead行的列表之前修復記錄。您可以

  • 刪除這些行
  • 添加相關作者細節AUTHORS,或
  • 也許BooksRead筆者細節有錯別字或前導/尾隨空白。修復BooksRead行中的作者詳細信息以匹配AUTHORS中的記錄
+2

這是AUTHORS表中的一個條目,在「R.R.Martin」之間有一個空格 - 將其扔掉。它應該有「R.R.馬丁」。所以,你是對的:當你在限制之前添加數據時發生了什麼。謝謝! – beh1

+0

@ beh1現在是標準化數據的好時機,並且在'AUTHORS'表中使用數字ID並引用它們而不是組合鍵 – Phil