2014-01-08 34 views
3

我最近在我們的一箇舊數據庫中遇到了bizzare情況,我們的DBA(不是創建它的那個)不確定爲什麼會這樣做,它會有。我們唯一能想到的就是它是錯誤的。以下外鍵約束已定義在表上:SQL:指向同一列的列上的外鍵

CREATE TABLE [dbo].[SomeTable] 
(
    [Id] SMALLINT IDENTITY (1,1) NOT NULL, 
    -- other columns 

    CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED ([Id] ASC) 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[SomeTable] WITH CHECK ADD CONSTRAINT [FK_SomeTable_SomeTable] 
FOREIGN KEY ([Id]) REFERENCES [dbo].[SomeTable] ([Id]) 
GO 

ALTER TABLE [dbo].[SomeTable] CHECK CONSTRAINT [FK_SomeTable_SomeTable] 
GO 

任何人都知道或有任何想法,這可能實際上做什麼?

+3

這沒有意義。 –

+0

也許他們試圖讓它成爲主鍵,並在首次嘗試時做錯了。除非它有一些奇怪的副作用,如防止插入或刪除? – Ben

+1

@Ben - 如果該列尚未用主鍵或唯一約束聲明,則不可能創建外鍵。不,它不阻止任何事情。 –

回答

1

可以使用引用相同表來實現層次結構的外鍵,但當然我們應該在同一個表中使用不同的列。 我認爲這個表的創建者只是犯了錯誤。

0

由於外鍵約束,行無法刪除。至少SQL Server沒有足夠的智能來認識到外鍵的目標實際上是同一行。嘗試編輯主鍵的值也是一樣。

我想這可能是爲了防止行被改變或刪除的設計,但更好的解決方案是使用觸發器來代替。