我最近在我们的一个遗留数据库中遇到了一个古怪的场景,而我们的DBA(不是那个创建它的人)不确定为什么会这样做以及它会带来什么好处。我们唯一能想到的是它是错误的。已在表上定义了以下外键约束:
CREATE TABLE [dbo].[SomeTable]
(
[Id] SMALLINT IDENTITY (1,1) NOT NULL,
-- other columns
CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SomeTable] WITH CHECK ADD CONSTRAINT [FK_SomeTable_SomeTable]
FOREIGN KEY ([Id]) REFERENCES [dbo].[SomeTable] ([Id])
GO
ALTER TABLE [dbo].[SomeTable] CHECK CONSTRAINT [FK_SomeTable_SomeTable]
GO
任何人都知道或对这实际可能做的事情有任何想法?
答案 0 :(得分:1)
可以使用引用同一个表的外键来实现层次结构,但当然我们应该在同一个表中使用不同的列。 我认为这张桌子的创造者犯了错误。
答案 1 :(得分:0)
由于外键约束,无法删除行。至少SQL Server不够聪明,无法意识到外键的目标实际上是同一行。尝试编辑主键的值也是如此。
我想这可能是设计上的,以防止行被更改或删除,但更好的解决方案是使用触发器。