我正在开发一个业务管理系统,其中我使用层次结构管理方式将客户列表组织为树:
Customer A
-- Customer B
-- Customer C
-- Customer D
我有一个表存储所有客户数据(名称,联系信息等)和另一个表来映射这棵树的关系:
CREATE TABLE customer_tree
(
"fromID" int,
"toID" int,
CONSTRAINT "fk_from_tree_customer" FOREIGN KEY (fromID) REFERENCES CustomerNode(id),
CONSTRAINT "fk_to_tree_customer" FOREIGN KEY (toID) REFERENCES CustomerNode(id),
"id" int IDENTITY(1,1) PRIMARY KEY)
基本上fromID是父节点,toID是其中一个子节点的ID,为每个子节点插入一行。
现在,我遇到的问题是保持此表更新。每当我删除一个客户时,我都希望删除此表中的关系。我尝试使用类似这样的级联创建表:
... FOREIGN KEY (fromID) REFERENCES CustomerNode(id) ON DELETE CASCADE,
... FOREIGN KEY (toID) REFERENCES CustomerNode(id) ON DELETE CASCADE
但数据库不允许我创建此表,因为它会导致现在允许的循环引用。在代码中检查树结构的循环节点,因此实际循环不会成为问题。但是,每当我删除节点时,我都希望自动删除这种关系。
有没有简单的方法来完成这项工作或解决循环参考检查?
谢谢你的时间!
答案 0 :(得分:1)
您可以在CUSTOMER表上创建删除操作的触发器。
在此触发器中,您可以从customer_tree表中删除相应客户与删除客户相同的内容。
您可以构建触发逻辑,如下所示 -
CREATE TRIGGER ON Customer
BEFORE DELETE
BEGIN
DELETE FROM Customer_Tree Ct
WHERE Fromid IN (SELECT Id FROM Deleted)
OR Toid IN (SELECT Id FROM Deleted)
END
GO
我实际上并不擅长SQL Server,但我从MSDN端找到了这个关键字。
答案 1 :(得分:0)
根据我的经验,答案是否定的。你必须从代码。您可以使用SQL Server中的hierarchyid数据类型进行调查。