ホームページ >データベース >mysql チュートリアル >mysqlトリガーの詳しい説明
トリガーとは:
トリガーは、データの整合性を確保するために SQL サーバーによって提供されるメソッドであり、テーブル イベントに関連する特別なストアド プロシージャです。プログラムによって呼び出されます。手動で開始されるのではなく、イベントによってトリガーされます。たとえば、テーブルが操作されると (挿入、削除、更新)、その実行がアクティブ化されます。トリガーは、データ整合性の制約とビジネス ルールを強制するためによく使用されます。 トリガーは、DBA_TRIGGERS および USER_TRIGGERS データ ディクショナリにあります。 SQL3 トリガーは、データベースを変更するためにシステムによって自動的に実行できるステートメントです。
トリガー構文:
CREATE TRIGGER 996fb053a7f01d8ea69053e2ff3c5da7 -- トリガーには最大 64 文字の名前が必要で、その後に区切り文字を付けることができます。これは、基本的に MySQL の他のオブジェクトの命名方法と似ています。
{ BEFORE | AFTER } -- トリガーには実行時間を設定できます。イベントの発生前または後に設定できます。
{ INSERT | UPDATE | DELETE } -- トリガーされるイベントを設定することもできます。挿入、更新、または削除の実行中にトリガーできます。
ON -- トリガーは特定のテーブルに属します。このテーブルに対して挿入、更新、または削除操作が実行されると、トリガーがアクティブになります。同じテーブルに同じイベントを与えることはできません。 。
FOR EACH ROW -- トリガーの実行間隔: FOR EACH ROW 句は、テーブル全体に対して 1 回ではなく、1 行おきにアクションを実行するようにトリガーに通知します。
40ae998b65dc70c6fa0a6d4e403268ae -- トリガーには、トリガーされる SQL ステートメントが含まれます。ここでのステートメントには、複合ステートメントを含む任意の正当なステートメントを使用できますが、ここでのステートメントには関数と同じ制限が適用されます。
テーブルに対して作成できるトリガーは 1 つだけです。
トリガー: 特定の状況を監視し、特定の操作をトリガーします。
トリガー作成構文の 4 つの要素: 1. 監視場所 (テーブル) 2. 監視イベント (挿入/更新/削除) 3. トリガー時間 (後/前) 4. トリガーイベント (挿入/更新/削除)
文法:
create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin
sql state;
end;
注: それぞれの色は、上記の 4 つの要素に対応しています。
まず 2 つのテーブルを作成します:
#商品表 create table g ( id int primary key auto_increment, name varchar(20), num int ); #订单表 create table o ( oid int primary key auto_increment, gid int, much int ); insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10);
トリガーを使用しない場合: ここで 3 つのアイテムを販売すると仮定します。1 つのことを行う必要があります
1. 注文テーブルにレコードを挿入します
insert into o(gid,much) values(1,3);
2.製品テーブル内の製品 1 の残り数量
update g set num=num-3 where id=1;
さて、トリガーを作成しましょう:
最初にステートメントを実行する必要があります: 区切り文字 $ ($ で終わるように mysql ステートメントに指示することを意味します)
create trigger tg1 after insert on o for each row begin update g set num=num-3 where id=1; end$
insert into o(gid,much) values(1,3)$
を実行するだけで、製品 1 の数量が 7 に変更されたことがわかります。これは、注文を挿入すると、トリガーが自動的に更新操作を実行することを意味します。
しかしここで問題が発生しました。トリガーの num と id がハードコーディングされているため、どの製品を購入しても、最終的には製品 1 の数量が更新されます。たとえば、別のレコードを注文テーブルに挿入します。 insert into o(gid,much) names(2,3) を実行すると、製品 1 の数量は 4 に変更されましたが、製品 2 の数量は変更されたことがわかります。これは明らかに私たちが望む結果ではありません。前に作成したトリガーを変更する必要があります。
トリガー内の行の値を参照するにはどうすればよいですか。つまり、新しく挿入した注文レコード内の gid または much の値を取得する必要があります。
挿入の場合、新しく挿入された行は new で表され、行内の各列の値は new.column 名で表されます。
これでトリガーを次のように変更できるようになりました
create trigger tg2 after insert on o for each row begin update g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同) end$
2 番目のトリガーが作成されました。まず最初のトリガーを削除しましょう
drop トリガー tg1$
もう一度テストして注文レコードを挿入しましょう :insert into o(gid, much)values(2,3)$
実行後、製品 2 の数量が 7 に変更されていることがわかり、これは正しいです。
まだ 2 つの状況があります:
1. ユーザーが注文をキャンセルし、私たちが注文を直接削除した場合、対応する商品の数量を追加し直す必要がありますか?
2. ユーザーが注文の数量を変更する場合、トリガーの変更をどのように記述しますか?
まず最初の状況を分析しましょう:
監視場所: o テーブル
監視イベント: 削除
トリガー時間: 後
トリガーイベント: update
削除の場合: 元々削除された行を参照したい場合は、old を使用して削除された行の値を参照できます。行。
その後、トリガーは次のように記述する必要があります:
create trigger tg3 after delete on o for each row begin update g set num = num + old.much where id = old.gid;(注意这边的变化) end$
Created。
oid = 2$のdelete from oを実行すると
商品2の数量が再び10になることがわかります。
2 番目のケース:
監視場所: o テーブル
監視イベント: update
トリガー時刻: after
トリガーイベント: update
更新の場合: 変更された行、変更前のデータを使用します。 old は old で表されます。列名は変更前の行の値を指します。
変更されたデータは new で表され、列名は変更後の行の値を指します。
その後、トリガーは次のように記述する必要があります:
create trigger tg4 after update on o for each row begin update g set num = num+old.much-new.much where id = old/new.gid; end$
まず古い数量を復元し、次に新しい数量を減算して、変更された数量を取得します。
テストしてみましょう: まず、テストを容易にするために、製品テーブルと注文テーブルのデータをクリアします。
商品テーブルに 3 つの商品を挿入するとします。数量は 10、
3 つの商品を購入 1: o(gid,much) 値 (1,3)$ に挿入します。
このとき、商品の数量 1は 7 になります。
次に、挿入された注文レコードを変更します: update o set much = 5 where oid = 1$
製品 1 の 5 個のアイテムを購入するように変更します。この時点で、製品テーブルをクエリすると、次のことがわかります。製品 1 の数量は 5 のみです。これは、トリガーが機能していることを示しています。
上記はこの記事のトリガーに関するすべてです。お役に立てば幸いです。
関連する推奨事項:
以上がmysqlトリガーの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。