2

你好,親愛的堆棧溢出社區刪除,SQL:刪除父當孩子(但理論父)在OneToOne關係

我搜索了很多時間已經,但我無法找到一個解決辦法我非常獨特的場景。
也許你們可以幫忙。我們假設我們有two tables

|domain_realm      | | password_policy      | 
|-------------------------------- | | ---------------------------------------| 
|id domain password_policy_id | | id min_chars min_numbers min_length | 
|1  1  11     | | 11 3   2      | 
|2  1  12     | | 12 4   1      | 

一個叫domain_realm,另外一個password_policy

這是一對一的關係,因此一個domain_realm只有一個password_policy

現在到了在這種情況下相當獨特的案例:
domain_realm持有password_policy_id(或多或少FK)而不是password_policy持有的外鍵它的父。

Why would someone do this?
Let's assume password_policy is part of a package for many other applications not working with domain realms. Therefore keeping the table clean of any specific rows no other application needs (e.g. fk_domain_relam) is mandatory.


現在看來是不可能刪除domain_realm時自動刪除(ON DELETE CASCADE)的相關password_policy

有沒有辦法做到這一點的SQL方式或我必須知道這並確保password_policy被刪除在我的代碼?

這將是相當討厭的,因爲如果我不得不直接刪除數據庫中的domain_realm(調試或支持的原因)我已經創建了一個孤兒,我必須知道這一點。否則,孤兒將永遠留在那個分貝中。

非常感謝你,甚至閱讀本文。

+0

你問一個問題,關於你的結構不提供結構.. –

+0

說不上你的意思,和/或需要。有一個圖形和一個相當準確的解釋我的結構。 :-( – sdk

+1

首先,請提供格式化文本,而不是圖片,其次,您的鏈接已損壞;) –

回答

0

您可以在從domain_realm刪除後創建觸發器。我不是100%地肯定在PostgreSQL的語法,但它應該是這個樣子:

CREATE OR REPLACE FUNCTION update_policy() RETURNS TRIGGER AS $$ 
    BEGIN 
      DELETE FROM password_policy WHERE password_policy_id = OLD.password_policy_id; 
      IF NOT FOUND THEN RETURN NULL; END IF; 
    END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER clean_policy 
AFTER DELETE ON domain_realm 
FOR EACH ROW EXECUTE PROCEDURE update_policy(); 
+0

我不確定'IF NOT FOUND THEN RETURN NULL; END IF;'(導致我到「ERROR:控制到達觸發器過程的末尾而沒有返回」),但它的工作原理與我所希望的完全相同! 我只是將上面的內容更改爲簡單的'RETURN NULL'。 我會進一步研究觸發器,爲什麼我的解決方法可能是錯誤的,但現在非常感謝你! – sdk