quantity_on_hand
トランザクションが挿入/更新/削除されたときに更新する必要がある列を持つ製品テーブルがあります。挿入テーブルでは、トランザクションの数量でフィールドを減らしました。更新では、トランザクションの値に従って減らして追加しましNEW
たOLD
。トリガーでは、取引額DELETE
に基づいて株式を追加しただけです。OLD
およびトリガーは正常に動作INSERT
しUPDATE
ていますが、DELETE
トリガーは適切に更新されておらず、エラーも生成されていません! コードは次のとおりです。
INSERT TRIGGER (ワーキング)
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;
$$
UPDATE TRIGGER (ワーキング)
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;
$$
意図したとおりに機能しない DELETE TRIGGER
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 Community Server (GPL)
更新: DELETE トリガーは、削除コマンドがテーブルに直接与えられている場合、完全に正常に実行されます。ただし、このテーブルにカスケード削除があるテーブルの行を削除している場合、カスケード削除は機能していますが、削除トリガーは実行されていません。たとえば、テーブルには主キーが外部キーとしてあり、関係はカスケードです。対応する外部キーの行を削除するたびに、行は削除されますが、削除トリガーは実行されません。stockout
delete from stockout where id_stockout=12
stockout
stockout
salesinv_det_items
stockout
salesinv_det_items
stockout
stockout