建立外部索引鍵關聯性時發生時,可能發生【資料表中的資料行與現有主索引鍵或UNIQUE條件約束不相符】

本文將介紹建立外部索引鍵關聯性的一些注意事項。

情境描述

假設您有兩個資料表,其主索引鍵(Primary Key)都是由複合鍵值所組成(如下圖),若您嘗試於 detail 資料表建立外部索引鍵(Foreign Key)關聯到 master 資料表。

image

若您使用 SSMS 建立關聯,您可能遇到如下圖的錯誤訊息:

image

您也可以嘗試使用 T-SQL 的 ALTER TABLE 敘述來建立關聯。

ALTER TABLE detail
ADD CONSTRAINT FK_detail_master FOREIGN KEY (CaseNo,ConferenceDate,ItemType,ConferenceType)
REFERENCES dbo.master(CaseNo,ConferenceDate,ItemType,ConferenceType)

此時會看到類似下圖的錯誤訊息。

image

發生問題原因

根據英文版的錯誤訊息,比較容易得知問題出在哪,會發生這個問題的原因可能在於參考欄位的順序與 master 資料表的順序不一致所造成。

可能的解決方法

因此我們先來查看 master 資料表主索引鍵的定義,由下圖可知,主索引鍵是由【CaseNo、ConferenceDate、ConferenceType 及 ItemType】所組成。

image

因此在建立關聯時,若您未依照 master 資料表的主索引鍵的順序建立外部索引鍵,就可能遇到上面所遇到的錯誤訊息。重新利用 SSMS 來建立 detail 資料表與 master 資料表的外部索引,於 detail 資料表的設計畫面中,點選工具列中的【關聯性】按鈕。

image

於【外部索引鍵關聯性】視窗中點選【加入】來新增外部索引鍵,然後點選右側【資料表及資料行規格】的image來設定關聯的資料行。

image

這一次我們依照 master 資料表主索引鍵的順序來與 detail 資料表進行關聯(如下圖),設定完畢後按確定。

image

您會看到外部索引鍵已經被建立。

image

同樣的上述步驟您一樣可以用 T-SQL 來完成,例如下列的指令碼:

ALTER TABLE detail
ADD CONSTRAINT FK_detail_master FOREIGN KEY (CaseNo,ConferenceDate,ConferenceType,ItemType)
REFERENCES dbo.master(CaseNo,ConferenceDate,ConferenceType,ItemType)

不管您使用 GUI 還是 T-SQL 來建立關聯,我們都可以在資料庫圖表中看到關聯已經被順利建立(如下圖)。

image

備註

這是一個看起來很簡單但實際上卻可能沒注意就造成您無法順利建立外部索引鍵,希望這篇短文對遇到類似問題的您有幫助。

參考資料

- FOREIGN KEY 條件約束

- 建立與修改 FOREIGN KEY 條件約束

- ALTER TABLE (Transact-SQL)

- CREATE TABLE (Transact-SQL)