Sql 简单示例-在表aaaIsChildOf';可能导致循环或多个级联路径

Sql 简单示例-在表aaaIsChildOf';可能导致循环或多个级联路径,sql,sql-server,tsql,constraints,foreign-key-relationship,Sql,Sql Server,Tsql,Constraints,Foreign Key Relationship,我尝试在sql中实现一个简单的a依赖于B关系: IF OBJECT_ID ('dbo.AdependsonB', 'U') IS NOT NULL DROP TABLE dbo.AdependsonB; IF OBJECT_ID ('dbo.aaaPerson', 'U') IS NOT NULL DROP TABLE dbo.aaaPerson; CREATE TABLE aaaPerson ( [id] INT NOT NULL IDENTITY(1

我尝试在sql中实现一个简单的a依赖于B关系:

IF OBJECT_ID ('dbo.AdependsonB', 'U') IS NOT NULL
        DROP TABLE dbo.AdependsonB;
IF OBJECT_ID ('dbo.aaaPerson', 'U') IS NOT NULL
        DROP TABLE dbo.aaaPerson;

CREATE TABLE aaaPerson
(
    [id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [name] VARCHAR(40) 
)

CREATE TABLE AdependsonB
(
    [IsChildOf] INT NOT NULL,
    [Parent] INT NOT NULL,
    CONSTRAINT [pk_AdependsonB] PRIMARY KEY ([IsChildOf],[Parent]),
    CONSTRAINT [CHK_identity] CHECK ([IsChildOf] <> [Parent]),  
    CONSTRAINT [FK_AdependsonB_IsChildOf-aaaPerson_id] FOREIGN KEY ([IsChildOf]) REFERENCES aaaPerson(id) ON DELETE CASCADE,
    CONSTRAINT [FK_AdependsonB_Parent-aaaPerson_id] FOREIGN KEY ([Parent]) REFERENCES aaaPerson(id) ON DELETE CASCADE,
)
如果对象_ID('dbo.AdependsonB','U')不为NULL
放置表dbo.AdependsonB;
如果对象ID('dbo.aaaPerson','U')不为空
放置表dbo.aaaPerson;
创建表aaaPerson
(
[id]INT非空标识(1,1)主键,
[姓名]瓦查尔(40)
)
创建表AdependsonB
(
[IsChildOf]INT不为NULL,
[Parent]INT不为空,
约束[pk_AdependsonB]主键([IsChildOf],[Parent]),
约束[CHK_identity]检查([IsChildOf][Parent]),
约束[FK_AdependsonB_IsChildOf-aaaPerson_id]外键([IsChildOf])在删除级联上引用aaaPerson(id),
约束[FK_AdependsonB_Parent-aaaPerson_id]外键([Parent])在删除级联上引用aaaPerson(id),
)
运行这些代码行时,我遇到以下错误:

在表aadependsonb'上引入外键约束“FK_AdependsonB_Parent-aaaPerson_id”可能会导致循环或多个级联路径

当在任一外键约束处省略“ON DELETE CASCADE”时,代码运行良好,但语义不正确

在这种情况下,有人能给出为什么和怎么做的建议吗? 关于这个问题,我已经读了很多书,但我不明白为什么没有任何解决方法就不能实现这样简单的关系


提前多谢

我建议在进入某种场景时要小心,在这种场景中,父亲可以得到很多儿子,删除一个儿子会导致删除父亲,这会导致删除所有儿子(你能看到这里的循环吗?)

这种逻辑可以位于业务层,并且处理得更好(删除所有兄弟,等等删除父亲)

解析器是正确的,这既不可行也不合理,您(可能)正在使用冗余的[IsChildOf]和[Parent]列创建多个级联路径的循环


您不能仅使用自引用FK吗?您想要实现什么?

相关:为什么子表同时需要IsChildOf和Parent?你能解释一下这两者有什么不同吗?家长真的是“顶级家长”吗?这种关系难道不能更简单地表达出来吗?你应该始终能够通过遵循层次化的路径到达最高的父级。您可能在一个表中包含所有这些信息。