MySQLフリップフロップ学習まとめ

1033 ワード

 
# , order , goods
delimiter $
CREATE TRIGGER trigger1
AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$
INSERT INTO`order`(gid,much)VULES(1,5)を実行した後、SELECT*FROM good WHERE id=1テレビの数が残り30を発見しました。INSERT INTO`order`(gid,much)VALES(2,100)を実行したら、冷蔵庫の量が残りました。77はどのように穴を救いますか?udateイベントはinsertの後に発生したので、事前にユーザーの注文数(すなわちorderテーブルのmuchフィールド)をフィルタリングすることはできません。トリガーを作成する時に、afterキーワードをbeforeに変更し、ユーザーの注文数を判断します。まず、先に行ったトリガーtrigger 1を削除します。
 
#
# :before
delimiter $
CREATE TRIGGER trigger1
BEFORE INSERT ON `order`
FOR EACH ROW
BEGIN
IF new.much >5 THEN
SET new.much=5
END IF;
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$
このように、INSERT INTO`order`(gid,much)VULES(2,100)を実行すると、orderテーブルに書き込まれた注文数は実は5だけです。同様に、goodsテーブルの在庫数は5だけ減少しています。insert操作の前にudate操作をトリガしたので、注文数を判断することができます。