2015-01-13 97 views
1

我驚訝地發現我可以創建是指在完全相同的表和列定義主鍵的外鍵,例如:與同一列FK引用PK

ALTER TABLE dbo.Foo WITH CHECK ADD CONSTRAINT FK_Foo_Foo FOREIGN KEY(FooId) 
REFERENCES dbo.Foo (FooId) 

我有一個客戶數據庫與這樣一個FK定義,它似乎是完全多餘的。

它有什麼用途?

注意:這不是等級關係的情況 - FK字段在同一個表中作爲父ID而不是不同字段,而是PK字段本身。

+0

用法的一個很好的例子是父母/小孩的風格設計。 – gvee

+0

我不認爲這適用,請參閱我的編輯。 –

+2

我沒有看到任何可能的用途,除了防止刪除。我甚至不知道如果您嘗試從此表中刪除一行,會發生什麼情況。 –

回答

1

引用自身的外鍵是循環引用或無限遞歸關係。

約束永遠不會違反,因爲該行始終與自身匹配。

我的猜測是,這可能是設計中的錯誤,也可能是未來發展的一個臨時標記,這從未被貫徹過。

這是一個完全冗餘的功能,既可以刪除,也可以單獨放置。我會意識到的一件事是,Microsoft可能會在SQL Server的更高版本中禁止自引用FK。出於這個原因,如果將來的兼容性是一個考慮因素,我會傾向於刪除這個約束。

要使父級子級別工作,外鍵必須引用不同的列。