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