比方說,我有3個表,「child1」,「child2」和「child3」,都有一個外鍵到表「父母」。 表「父母」得到了一個字段「狀態」,我想如果狀態設置爲「0」的元素,它的所有孩子都被刪除。 (我使用觸發器來檢測狀態變化)。 所以這就像調用「級聯刪除」,但不刪除對象...手動調用級聯刪除?
有沒有一種好辦法做到這一點?
比方說,我有3個表,「child1」,「child2」和「child3」,都有一個外鍵到表「父母」。 表「父母」得到了一個字段「狀態」,我想如果狀態設置爲「0」的元素,它的所有孩子都被刪除。 (我使用觸發器來檢測狀態變化)。 所以這就像調用「級聯刪除」,但不刪除對象...手動調用級聯刪除?
有沒有一種好辦法做到這一點?
觸發器檢測到更改,您需要使用它來觸發存儲過程。這裏有一個很好的教程:http://markalexanderbain.suite101.com/mysql-stored-procedures-and-triggers-a71091
或者,如果您使用PHP,ColdFusion或其他中間層,您可以將記錄讀入一個變量。刪除該行,然後重新插入記錄。但是,使用存儲過程來完成這項工作會更好。
這個問題不是關於觸發器或過程,而是一種在不刪除父項的情況下進行級聯刪除的方法! –
您需要使用存儲過程來完成此操作。你已經有觸發器,編寫一個存儲過程來刪除子表中的記錄並從觸發器中觸發它。如果你問是否可以直接進行級聯而不刪除父母,那麼答案就是你不能。 – invertedSpear
好吧,正確的答案是:No. :( 謝謝 –
刪除與外鍵關聯於母公司所有的孩子..
authorname = Bill, authorid = 5
,我們需要通過的法案刪除所有書籍
DELETE FROM books WHERE authorid=5
編輯:對不起,重讀..你可以實現這個邏輯的狀態
所以,如果我明白,你打算導致所有FK相關的孩子被刪除,而沒有實際刪除父行? –
如果您使用的是觸發器,那麼您很可能會實施相當不好的做法(並且性能會受到影響)。 – Romain
@Romain我恭敬地不同意觸發器=壞習慣。實際上,這個問題聽起來像是一個觸發器的有效用例,它會在父狀態更改時刪除子行。 –