2014-02-17 50 views
100

嘗試將外鍵添加到我的tblDomare表時遇到問題;我在這裏做錯了什麼?ALTER TABLE語句與FOREIGN KEY約束衝突

CREATE TABLE tblDomare 
(PersNR VARCHAR (15) NOT NULL, 
fNamn VARCHAR (15) NOT NULL, 
eNamn VARCHAR (20) NOT NULL, 
Erfarenhet VARCHAR (5), 
PRIMARY KEY (PersNR)); 

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) 
Values (6811034679,'Bengt','Carlberg',10); 

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) 
Values (7606091347,'Josefin','Backman',4); 

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) 
Values (8508284163,'Johanna','Backman',1); 

CREATE TABLE tblBana 
(BanNR VARCHAR (15) NOT NULL, 
PRIMARY KEY (BanNR)); 

INSERT INTO tblBana (BanNR) 
Values (1); 

INSERT INTO tblBana (BanNR) 
Values (2); 

INSERT INTO tblBana (BanNR) 
Values (3); 

ALTER TABLE tblDomare 
ADD FOREIGN KEY (PersNR) 
REFERENCES tblBana(BanNR); 

錯誤消息:

ALTER TABLE語句衝突與外鍵約束 「FK_ tblDomare _PersN__5F7E2DAC」。衝突發生在數據庫「almu0004」,表「dbo.tblBana」,列'BanNR'中。

回答

215

它的發生是因爲你試圖創建一個外鍵從tblDomare.PersNRtblBana.BanNR但/和tblDomare.PersNR值沒有任何價值的tblBana.BanNR匹配。您無法創建違反參照完整性的關係。

+43

這是我的答案,但我仍然在努力認識到問題出在哪裏,所以我會給一個外行人的例子。如果您有一個名爲'Orders'的表和一個名爲'Customers'的表,並且您刪除了一些老客戶,但不是他們的訂單,如果您決定從Orders.CustomerId向客戶創建外鍵,則會出現此錯誤。ID。有些訂單不再有相應的客戶,所以不可能添加外鍵。 –

+0

@Smutje,感謝=))) – isxaker

+7

這裏有一個查詢,以檢查不正確的值: 從referrerTable 選擇不同referrerTable.referenceColumn 左加入referredTable 上referredTable.referenceColumn = referrerTable.referenceColumn 其中referredTable.referenceColumn爲null; – jumxozizi

9

我想,外鍵表中的列值應該與主鍵表的列值相匹配。如果我們試圖在兩個表之間創建一個外鍵約束,其中一列(將成爲外鍵)中的值與主鍵表的列值不同,那麼它將拋出該消息。

因此,總是建議只將這些值插入到主鍵列表列中的外鍵列中。

例如,如果主表列的值爲1,2和3,並且在外鍵列中插入的值不同,則查詢將不會執行,因爲它預期值在1 &之間3.

2

我有這個錯誤由於Smutje所提供的 確保您在基本外鍵表的外鍵列中沒有值,這些外鍵表不在您的引用表中(即基本外鍵表中的每個值(外鍵列的值)也必須在你的參考表格列中) 它很好地清空你的基礎外鍵表然後設置外鍵

4

清理表格中的數據,然後建立它們之間的關係。

+0

謝謝你,最多它的工作對我來說,如果他們有數據連關係完善更新,數據庫命令將不起作用。 –

+0

這是沒有必要的,只要它們是VAL刪除任何數據id根據正在創建的外鍵。 – jumxozizi

5

在添加外鍵的表,請執行下列操作

  1. 確認表必須清空或列數據應該匹配。
  2. 確保它不爲空。
  3. 如果表中包含不去設計和更改,請手動執行。

    ALTER TABLE表1添加外鍵(列名)的參考表2(列名)

    ALTER TABLE表1更改列列名稱屬性不爲空

13

這種查詢是非常有用的我。這表明,沒有任何比賽

select FK_column from FK_table 
WHERE FK_column NOT IN 
(SELECT PK_column from PK_table) 
13

它可以創建使用ALTER TABLE表名WITH NOCHECK ...外鍵,這將使違反外鍵數據的所有值。

「ALTER TABLE tablename WITH NOCHECK ...」選項添加FK - 此解決方案適用於我。

+8

請注意,允許此類違規操作會破壞外鍵約束的用途。 – reformed

1

您輸入的表中的數據(tbldomare)與您已分配主鍵表的數據不匹配。在tbldomare之間寫入並添加此詞(用nocheck),然後執行您的代碼。

例如你輸入一個表tbldomar這個數據

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) 
Values (6811034679,'Bengt','Carlberg',10); 

,你分配一個foreign key表僅1,2,3接受。

你有兩種解決方案,一種是刪除你輸入的表中的數據,然後執行代碼。另一種是寫這個字(與NOCHECK)把你的表名之間並添加 這樣

ALTER TABLE tblDomare with nocheck 
ADD FOREIGN KEY (PersNR) 
REFERENCES tblBana(BanNR); 
-1

,只是僅供參考,如果你做的所有的數據引用檢查,發現沒有不良數據明顯...不可能在兩個表和這些字段是兩個表中的主鍵的字段之間創建外鍵約束!不要問我怎麼知道這一點。

0

Smutje是正確的,乍得HedgeCock提供了一個偉大的外行人的例子。 我想通過提供查找/刪除這些記錄的方式來構建Chad的示例。 我們將使用Customer作爲父母和訂單作爲孩子。 CustomerId是公共領域。

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId 
where Parent.CustomerId is null 

如果您正在閱讀本主題...您將獲得結果。這些是孤兒。 select * from Order Child left加入Customer Parent上的Child.CustomerId = Parent.CustomerId 其中Parent.CustomerId爲null請注意右下角的行數。

無論您需要什麼,您都可以驗證您要刪除這些行!

begin tran 
delete Order 
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId 
where Parent.CustomerId is null 

運行第一位。 檢查行數=您的預期

提交TRAN

commit tran 

要小心。有人肆意的節目讓你陷入了混亂之中。確保你明白他們爲什麼在刪除孤兒之前。也許父母需要恢復。

相關問題