mysqlのトリガ

1562 ワード

ちょっとjsのイベントに似ています.テーブルの操作を監視し、関連する操作をトリガーできます.
事前にあるテーブルにコードをバインドし、テーブルの一部が変更された場合(削除)、システムは自動的にコードをトリガーし、実行します.
例:2枚の表、1枚の注文表、1枚の商品表があり、1つの注文を生成するたびに、商品の在庫が減少することを意味します.
フリップフロップ
トリガー:イベントタイプ、トリガーイベント、トリガーオブジェクト
イベントタイプ:削除
トリガ時間:前後before after
注意:トリガはテーブルのみでサポートされ、ビューはサポートされていません.
各テーブルのイベントごとに1つのトリガのみが許可されます.したがって,各テーブルには最大6つのトリガ(insert前後,update前後,delete前後)がある.
トリガーの作成
構文:
create trigger t1(     )
after (    )
insert  (    )
on orders(   ,    )
for each row (      )
begin (  )
update goods xxx  (      ,              ,  )
end;  (  )


ここで2つのセミコロンが発生しました.この場合delimiterカスタムシンボルが必要です
文の終端を一時的に変更します.後続のコードではカスタムシンボルに出会ってこそ終了します.
臨時修正をする
delimiter ;
例ordersテーブルにトリガを追加
delimiter $

create trigger demo1 
after 
insert 
on orders 
for each row 
begin
update goods set num = num-1 where gid = 1; 
end$
delimiter ;

そしてordersテーブルにデータを挿入します
insert into orders values(123,1,4);

goodsテーブルが確かに変わったことに気づきました
しかしgidが1のnumだけが1を減算した.
死んだと書いてあるので、トリガにパラメータを渡す必要があります.
トリガを先に削除する必要があります
drop trigger demo1;
show triggers;

すべてのトリガを表示すると、demo 1トリガが削除されていることがわかります.
上記の問題を解決する.
old new
MySQLでは、old、newを使用して、現在のステータスと実行後の新しいステータスを記録します.
挿入するとき、old削除がないとき、newがありません
delimiter $

create trigger demo1 
after 
insert 
on orders 
for each row 
begin
update goods set num = num - new.much where gid = new.gid; 
end$
delimiter ;