我检查了一个遗留数据库,发现了几个引用列自身的外键。引用的列是主键列。
ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])
这是什么意思?
ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])
这个外键是完全多余且毫无意义的。删除它即可。当行与自身匹配时,它永远不会被违反,从而验证约束。
在分层表中,关系将存在于两个不同的列之间(例如
Id
和 ParentId
)。
至于为什么会被创建呢?很可能是通过视觉设计师的使用。如果右键单击对象资源管理器中的“Keys”节点并选择“新建外键”,然后关闭对话框而不删除创建的外键,然后在打开的表设计器中进行一些其他更改并保存,则会创建此有点多余的约束。
在某些情况下,这是减少模型冗余的首选方法。在使用自引用外键(如示例所示)时,您可以在表中的行之间创建层次结构关系。请注意从表中删除行时会发生什么,删除时级联可能会删除您仍然想要的行。 使用这些类型的键将一些数据验证转移到数据库模型,而不是让这成为程序/程序员的责任。有些服装更喜欢这种做事方式。我更喜欢确保程序和程序员负责——数据模型在生产环境中很难重构和升级。