2015-01-13 52 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。出于这个原因,如果将来的兼容性是一个考虑因素,我会倾向于删除这个约束。

要使父级子级别工作,外键必须引用不同的列。