自引用外键的含义是什么?

时间:2012-11-11 11:51:22

标签: sql-server-2008 foreign-keys

我浏览了一个遗留数据库,发现了一些引用列的外键。引用的列是主键列。

ALTER TABLE [SchemaName].[TableName]  WITH CHECK ADD  
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])

它是什么意思?

2 个答案:

答案 0 :(得分:15)

ALTER TABLE [SchemaName].[TableName]  WITH CHECK ADD  
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])

这个外键是完全冗余的,没有意义只是删除它。它永远不会被违反,因为一行匹配自己验证约束。

在分层表中,关系将介于两个不同的列之间(例如IdParentId

至于为什么通过使用可视化设计器很可能已创建它,如果右键单击对象资源管理器中的“键”节点并选择“新外键”,则关闭对话框而不删除创建的外键和然后在打开的表设计器中进行一些其他更改并保存它将创建这种冗余约束。

答案 1 :(得分:-7)

在某些情况下,这是减少模型冗余的首选方法。在使用自引用外键时(如示例所示),可以在表中的行之间创建层次关系。注意从表中删除行时会发生什么,在删除时级联可能会删除您仍想要的行。 使用这些键将一些数据验证移动到DB模型,而不是将其作为程序/程序员的责任。有些服装更喜欢这种做事方式。我更喜欢确保程序和程序员负责 - 数据模型很难在生产环境中重构和升级。