Mysql
是否存在對 MySQL 級聯觸發器缺乏支持的解決方法?
就目前而言,級聯外鍵操作不會啟動觸發器。
MySQL
我不想參與關於這是否好的辯論,我只想知道是否有解決方法。我目前正在
triggers
做這樣的事情:CREATE TRIGGER `Set_field1_on_update` BEFORE UPDATE ON `mytable` FOR EACH ROW BEGIN SET NEW.field1 = CONCAT(NEW.myforeignkey,'whatever'); END
myforeignkey
直接更改時效果很好,mytable
但ON UPDATE CASCADE
通過其引用表更新時效果不佳。無論如何,在級聯外鍵操作上實現上述功能(必要時使用觸發器以外的東西)?
解決方法,如果這是正確的詞,似乎是
AFTER UPDATE
對父表上的觸發器中的子表進行相同的更改,包含與子表上的觸發器相同的邏輯BEFORE UPDATE
,包裝在測試中僅當父表中的主鍵實際發生更改時才執行任何操作,這將導致級聯更新。DELIMITER $$ CREATE TRIGGER parent_after_update AFTER UPDATE ON parent_table FOR EACH ROW BEGIN # not using null-safe <=> comparison since PK cannot be null IF NEW.primary_key != OLD.primary_key THEN UPDATE child_table ct SET /* the same logic that's in the before update trigger on the child table */ WHERE ct.parent_primary_key = NEW.primary_key; END IF; END $$ DELIMITER ;
如果 parent_table 上的 primary_key 剛剛更改,那麼根據定義,在 parent_primary_key 列中具有新值的所有行 child_table必須剛剛通過級聯更新進行更新,因為在 parent_table.primary_key 中存在該值之前,不可能有在 child_table.parent_primary_key 中已經存在新值的任何行 …直到剛剛更新父表的 primary_key 之前,這些行不可能存在,因為它們違反了外鍵的引用約束(引用不存在的值)。
當然,我在這裡使用“主鍵”,而實際上外鍵可以引用父表的任何超鍵。
但是,這會讓人質疑您首先真正使用級聯更新來完成什麼,以及級聯更新的應用是否構成了合理的設計。您似乎正在從該值派生另一列,並儲存該派生列,而這兩種做法似乎都不太理想。
通常,級聯更新,至少在原則上,如果實際上不是,似乎不是對數據的更改,就像直接更改子表的更新一樣。“這些”子記錄引用父表中的“那個”行。在級聯更新之後,它們仍然如此,並且沒有任何改變,只是密鑰不同。