FK引用具有相同列的PK

时间:2015-01-13 17:11:24

标签: sql-server sql-server-2008-r2

我很惊讶地发现我可以创建一个外键,该外键引用在完全相同的表和列上定义的主键,例如:

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

我有一个定义了这种FK的客户数据库,看起来完全是多余的。

它有用吗?

NB。这不是层次关系的情况 - FK字段不是同一个表中作为父ID的不同字段,而是PK字段本身。

1 个答案:

答案 0 :(得分:1)

引用自身的外键是循环引用或无限递归关系。

永远不会违反约束,因为行总是匹配自己。

我的猜测是,这可能是设计中的错误,也可能是未来发展的临时标记,但从未遵循过。

这是一个完全冗余的功能,既可以删除,也可以单独使用。我要注意的一件事是微软可能会禁止在SQL Server的更高版本中自引用FK。出于这个原因,如果考虑未来兼容性,我倾向于删除约束。

要使父子层次结构起作用,外键必须引用不同的列。