1

quantity_on_handトランザクションが挿入/更新/削除されたときに更新する必要がある列を持つ製品テーブルがあります。挿入テーブルでは、トランザクションの数量でフィールドを減らしました。更新では、トランザクションの値に従って減らして追加しましNEWOLD。トリガーでは、取引額DELETEに基づいて株式を追加しただけです。OLD

およびトリガーは正常に動作INSERTUPDATEていますが、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 トリガーは、削除コマンドがテーブルに直接与えられている場合、完全に正常に実行されます。ただし、このテーブルにカスケード削除があるテーブルの行を削除している場合、カスケード削除は機能していますが、削除トリガーは実行されていません。たとえば、テーブルには主キーが外部キーとしてあり、関係はカスケードです。対応する外部キーの行を削除するたびに、行は削除されますが、削除トリガーは実行されません。stockoutdelete from stockout where id_stockout=12stockoutstockoutsalesinv_det_itemsstockoutsalesinv_det_itemsstockoutstockout

4

1 に答える 1

2

OP は次のように書いています。

回答: MySQL には 5.0 のリリース以降、外部キー カスケード操作からトリガーをトリガーしないバグがあり、現時点ではまだ解決されていません。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

それは言う: 現在、カスケードされた外部キーアクションはトリガーをアクティブにしません。

驚くべきことに思えるかもしれませんが、それは本当です!

その場合の答えは、カスケードする外部キーを持つのではなく、代わりにその機能を実行するトリガーを作成することです。

于 2015-08-21T22:46:27.037 に答える