2013-05-20 25 views
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 

但數據庫不會讓我創建這個表,因爲它導致的是現在允許週期性參考。對代碼中的循環節點檢查樹結構,因此實際的循環不會成爲問題。但是,我希望這種關係在我刪除節點時自動刪除。

是否有任何簡單的方法來完成這項工作或圍繞循環參考檢查?

謝謝你的時間!

+0

您確定只是因爲您刪除了客戶B而想刪除客戶C嗎?客戶C不會成爲客戶A的直接子女嗎? –

+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側這一關鍵詞。

Reference

+0

謝謝,那會工作=) – ChewToy

0

從我的經驗來看,答案是否定的。你必須從代碼中完成。您可以使用SQL Server中的hierarchyid數據類型作爲替代進行調查。