繁体   English   中英

SQL Server 2008-添加具有约束的自引用外键并获得“找不到数据类型”错误

[英]SQL Server 2008 - Adding self-referencing foreign key with constraint and getting “Cannot find data type” error

我正在使用SQL Server 2008,并且尝试添加具有ON DELETE CASCADE约束的自引用外键,但是遇到了一些问题。 基本上,我希望系统在删除节点时自动删除节点的所有子级。

我有一个具有以下基本结构的表Node

  • PK_Node_Id(主键)
  • ParentNodeId(想使它成为具有ON DELETE CASCADE约束的自引用外键。

问题出在我尝试添加约束时。 如果使用GUI设计器,则“ 插入”和“更新规范”选项将显示为灰色,并且我无法执行任何操作。

如果我尝试运行SQL语句来添加约束:

ALTER TABLE Node
ADD CONSTRAINT
FK_Node_Node
FOREIGN KEY (ParentNodeId)
REFERENCES Node (PK_Node_Id)
ON DELETE CASCADE;

我收到以下错误:

Cannot find data type FK_Node_Node.

FK_Node_Node是我的外键的名称。 不确定为什么要查询或寻找数据类型...

谢谢你的帮助!

我收到以下错误:找不到数据类型FK_Node_Node。

我怀疑您在运行ALTER TABLE语句时拼错了“ CONSTRAINT”一词。 该声明结果依然是语法上有效,但不是增加一个外键约束,它增加了一个名为(例如)型FK_Node_Node的“CONSTAINT”一 ,外加一个未命名的外键约束。

我希望系统在删除节点时自动删除节点的所有子级。

不幸的是,这是不可能的:SQL Server不允许级联引用动作形成循环。 ALTER TABLE语句应该给您的错误是:

在表“节点”上引入外键约束“ FK_Node_Node”可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

代替使用ON DELETE CASCADE,您需要自己执行递归删除:

;WITH Nodes (PK_Node_Id) AS
(
    SELECT PK_Node_Id
    FROM Node
    WHERE PK_Node_Id = @NodeId  -- @NodeId is the root node you want to delete

    UNION ALL

    SELECT Child.PK_Node_Id
    FROM Node Child JOIN Nodes Parent ON Parent.PK_Node_Id = Child.ParentNodeId
)
DELETE FROM Node
WHERE PK_Node_Id IN (SELECT PK_Node_Id FROM Nodes)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM