我去了旧的数据库,发现一对夫妇的引用列到自身的外键。 所引用的列是主键列。
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
)
至于为什么可能已创建它很可能通过使用可视化设计的,如果你右击对象浏览器中的“钥匙”节点,然后选择“新的外键”,然后关闭对话框而不删除创建的外键,然后做出一些在打开表设计等变化,并保存它会创建这种冗余的约束。
在某些情况下,这是为了减少在模型中冗余的优选方式。 在使用自参考外键(如图您的例子)创建您的表行之间的层次关系。 注意,当你从表中删除的行会发生什么,在级联删除可能会删除你仍然想行。 使用这些排序键将一些数据验证的DB模式,而不是使这个程序/程序员的责任。 有些衣服喜欢做的事情的这种方式。 我更喜欢以确保程序和程序员负责 - 数据模型是很难重构和升级在生产环境中。