FK 引用具有相同列的 PK
FK referencing PK with same column
我很惊讶地发现我可以创建一个外键,该外键引用在完全相同的 table 和列上定义的主键,例如:
ALTER TABLE dbo.Foo WITH CHECK ADD CONSTRAINT FK_Foo_Foo FOREIGN KEY(FooId)
REFERENCES dbo.Foo (FooId)
我有一个定义了这样的 FK 的客户数据库,它似乎完全多余。
它有什么用吗?
注意。这不是层次关系的情况——FK 字段不是同一个 table 中充当父 ID 的不同字段,而是 PK 字段本身。
引用自身的外键是循环引用,或无限递归关系。
永远不会违反约束,因为该行始终与自身匹配。
我的猜测是,这要么是设计中的错误,要么是为了将来开发的临时标记,从未跟进。
这是一个完全多余的功能,可以删除或单独保留。我会意识到的一件事是 Microsoft 可能会在更高版本的 SQL Server 中禁止自引用 FK。出于这个原因,如果考虑将来的兼容性,我会倾向于删除约束。
要使父子层次结构起作用,外键必须引用不同的列。
我很惊讶地发现我可以创建一个外键,该外键引用在完全相同的 table 和列上定义的主键,例如:
ALTER TABLE dbo.Foo WITH CHECK ADD CONSTRAINT FK_Foo_Foo FOREIGN KEY(FooId)
REFERENCES dbo.Foo (FooId)
我有一个定义了这样的 FK 的客户数据库,它似乎完全多余。
它有什么用吗?
注意。这不是层次关系的情况——FK 字段不是同一个 table 中充当父 ID 的不同字段,而是 PK 字段本身。
引用自身的外键是循环引用,或无限递归关系。
永远不会违反约束,因为该行始终与自身匹配。
我的猜测是,这要么是设计中的错误,要么是为了将来开发的临时标记,从未跟进。
这是一个完全多余的功能,可以删除或单独保留。我会意识到的一件事是 Microsoft 可能会在更高版本的 SQL Server 中禁止自引用 FK。出于这个原因,如果考虑将来的兼容性,我会倾向于删除约束。
要使父子层次结构起作用,外键必须引用不同的列。