0

我正在开发一个业务管理系统,其中我有一个使用层次结构管理风格组织为树的客户列表:

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

但是数据库不允许我创建这个表,因为它会导致现在允许的循环引用。在代码中检查树结构的循环节点,因此实际循环不会成为问题。但是,我希望在删除节点时自动删除此关系。

有没有简单的方法来完成这个或解决循环参考检查?

谢谢你的时间!

4

2 回答 2

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 这边找到了这个关键字。

参考

于 2013-05-20T12:37:48.937 回答
0

根据我的经验,答案是否定的。你必须从代码开始。您可以调查使用 SQL Server 中的hierarchyid数据类型作为替代方案。

于 2013-05-20T12:10:01.507 回答