我試圖創建一個記錄歷史記錄的數據庫(經驗表明,你將不得不做這一天或另一天)。MySQL:觸發條款「而不是更新」
我在這裏問了database-design-how-to-handle-the-archive-problem但沒有比鏈接here更好的了。
我的問題是關於哪裏做的代碼和技術上,如何(MySQL的給我頭痛)。首先我已經開始在Php中做這件事:在做任何插入之前,將記錄標記複製爲「過時」,然後修改記錄。
但是存在一個依賴性問題(許多許多和許多對待關聯也必須更新),這意味着編碼(這種或那種)所有依賴和更新隨表(不可接受)。
所以我正在考慮做數據庫服務器端的所有工作。這將大大簡化我的PHP代碼。
問題是我必須在修改它之前「歸檔」當前記錄。要這樣做,代碼必須在trigger "before update"。
這裏是我的代碼:
DELIMITER ;;
DROP TRIGGER IF EXISTS produit_trigger_update_before;
CREATE TRIGGER produit_trigger_update_before
BEFORE UPDATE ON produit
FOR EACH ROW BEGIN
/* */
INSERT INTO produit SET
id_origine = OLD.id_origine,
date_v_creation = OLD.date_v_creation,
date_v_start = OLD.date_v_debut,
date_v_end = NOW(),
...
last_record = OLD.last_record;
/* Dependancies : */
SET @last=LAST_INSERT_ID();
UPDATE categorie_produit SET [email protected]
WHERE id_produit = OLD.id;
UPDATE produit_attribut SET [email protected]
WHERE id_produit = OLD.id;
END;;
DELIMITER ;;
如果我得到這個代碼的工作,我所有的問題都沒有了。但是,該死的,它不工作:
mysql> update produit set importance=3;
ERROR 1442 (HY000): Can't update table 'produit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
mysql> Bye
在這種page有一個工作示例,它使用INSTEAD OF UPDATE
子句中的觸發器。 MySQL似乎不支持這一點。所以我的問題是這兩個概念(=你有任何其他「原則」可以工作)和/或技術(=你能使這個觸發器工作)。
通常的策略是離開行的「base」表,並將舊值複製到歷史記錄表中。這樣你就不需要應付依賴關係。 –