2016-07-29 97 views
1

我閱讀了級聯刪除的文檔,但有一點我不清楚是,如果可以設置數據庫,以便可以共享一個子行一旦刪除最近的引用父行,就會刪除一個父行和子行?當刪除最後一個引用時SQLite刪除共享行

(基本上我想要的是像一個std :: shared_ptr的外鍵。)

如果這是不可能的內置級聯刪除設置,可以將其與一個觸發做了什麼?那將是什麼樣子?

最後的選擇我是,雖然它是可能在我寫來創建此共享引用情況的圖書館,我可以簡單地讓它拋出一個異常時,構建這樣的事情,企圖發生。

具體來說,我有一個自我引用表,存儲類似抽象語法樹的東西。每個節點都有一個操作和兩個子節點。在使用數據庫的C++程序中,表示此表中的行的對象具有重載運算符,這些運算符返回的值將同時在表中創建行。例如,「a < < b」將返回臨時值「c」,並且數據庫將具有如下行:(c_id,'< <',a_id,b_id)。但是,您可以通過調用「a < < x」來實現,在這種情況下,數據庫將包含引用「a」的兩行。

編寫C++類是爲了在其構造函數中插入錶行,並在其析構函數中刪除錶行。本質上,我想創建和銷燬C++代碼中的臨時對象,以便在數據庫的狀態下進行鏡像。但是我想抑制刪除一個子行,如果它仍然被另一個父引用。

回答

1

這可能與trigger

當沒有父母還剩相同的孩子,刪除子:

CREATE TRIGGER t 
AFTER DELETE ON Parent 
WHEN NOT EXISTS (SELECT 1 FROM Parent WHERE ChildID = OLD.ChildID) 
BEGIN 
    DELETE FROM Child WHERE ID = OLD.ChildID; 
END;