[英]SQL Server 2008 - Adding self-referencing foreign key with constraint and getting “Cannot find data type” error
我正在使用SQL Server 2008,并且尝试添加具有ON DELETE CASCADE
约束的自引用外键,但是遇到了一些问题。 基本上,我希望系统在删除节点时自动删除节点的所有子级。
我有一个具有以下基本结构的表Node :
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.