[英]MySQL delete trigger not updating other table column
我有一個products表,該表的quantity_on_hand
列在插入/更新/刪除事務時需要更新。 在插入表中,我已按事務中的數量減少了該字段,而在更新中,我已根據事務中的NEW
和OLD
值進行了減少和添加。 在DELETE
觸發器中,我只是基於OLD
交易值添加了庫存。
INSERT
和UPDATE
觸發器工作正常,但DELETE
觸發器既未正確更新,也未生成任何錯誤! 這是代碼:
插入觸發器(工作中)
CREATE TRIGGER `tr_stockout_ai` AFTER INSERT ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin;
END;
$$
更新觸發(工作中)
CREATE TRIGGER `tr_stockout_au` AFTER UPDATE ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin;
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin;
END;
$$
刪除觸發操作不正確
CREATE TRIGGER `tr_stockout_ad` AFTER DELETE ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin;
END;
$$
有人可以告訴我我在這里想念的嗎? 請注意,沒有語法錯誤,代碼可以很好地創建觸發器,並且在執行觸發器並且MySQL沒有報告任何錯誤代碼時也沒有顯示錯誤! 我嘗試從AFTER
更改為BEFORE
但問題仍然相同。 刪除一行后, qoh
的值保持不變!
這個問題仍然存在。 我在運行MySQL 5.5的基於cPanel的環境中的其他MySQL數據庫服務器上進行了測試。 我的開發服務器和此生產服務器上的環境大致相同,並且問題相同。 Variable_name值innodb_version 1.1.8版本5.5.22-cll version_comment MySQL社區服務器(GPL)
更新:當直接在stockout
表上給出delete命令時(即delete from stockout where id_stockout=12
的stockout
中delete from stockout where id_stockout=12
DELETE觸發器執行得很好 。 但是,如果我們要刪除該stockout
表上具有級聯刪除功能的表上的行,則級聯刪除有效,但沒有執行stockout
的刪除觸發器。 例如,表salesinv_det_items
具有主鍵作為stockout
外鍵,並且該關系是級聯的。 每當我們在刪除一行salesinv_det_items
在相應的外鍵行stockout
被刪除,但在刪除觸發器stockout
不執行。
OP寫道:
答: MySQL自5.0發行以來存在一個錯誤,到現在為止該錯誤尚未解決,該錯誤不會從外鍵級聯操作觸發觸發器。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
它說: 當前,級聯的外鍵動作不會激活觸發器。
看起來很神奇,但這是真的!
答案是不要讓外鍵級聯,而要編寫觸發器來代替它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.