Mysql

是否存在對 MySQL 級聯觸發器缺乏支持的解決方法?

  • April 11, 2013

就目前而言,級聯外鍵操作不會啟動觸發器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直接更改時效果很好,mytableON 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 之前,這些行不可能存在,因為它們違反了外鍵的引用約束(引用不存在的值)。

當然,我在這裡使用“主鍵”,而實際上外鍵可以引用父表的任何超鍵。

但是,這會讓人質疑您首先真正使用級聯更新來完成什麼,以及級聯更新的應用是否構成了合理的設計。您似乎正在從該值派生另一列,並儲存該派生列,而這兩種做法似乎都不太理想。

通常,級聯更新,至少在原則上,如果實際上不是,似乎不是對數據的更改,就像直接更改子表的更新一樣。“這些”子記錄引用父表中的“那個”行。在級聯更新之後,它們仍然如此,並且沒有任何改變,只是密鑰不同。

引用自:https://dba.stackexchange.com/questions/39659