mysqlトリガーの詳しい説明

小云云
リリース: 2017-11-22 10:53:52
オリジナル
1974 人が閲覧しました

トリガーとは:

トリガーは、データの整合性を確保するために SQL サーバーによって提供されるメソッドであり、テーブル イベントに関連する特別なストアド プロシージャです。プログラムによって呼び出されます。手動で開始されるのではなく、イベントによってトリガーされます。たとえば、テーブルが操作されると (挿入、削除、更新)、その実行がアクティブ化されます。トリガーは、データ整合性の制約とビジネス ルールを強制するためによく使用されます。 トリガーは、DBA_TRIGGERS および USER_TRIGGERS データ ディクショナリにあります。 SQL3 トリガーは、データベースを変更するためにシステムによって自動的に実行できるステートメントです。

トリガー構文:

CREATE TRIGGER <トリガー名> -- トリガーには最大 64 文字の名前が必要で、その後に区切り文字を付けることができます。これは、基本的に MySQL の他のオブジェクトの命名方法と似ています。
{ BEFORE | AFTER } -- トリガーには実行時間を設定できます。イベントの発生前または後に設定できます。
{ INSERT | UPDATE | DELETE } -- トリガーされるイベントを設定することもできます。挿入、更新、または削除の実行中にトリガーできます。
ON -- トリガーは特定のテーブルに属します。このテーブルに対して挿入、更新、または削除操作が実行されると、トリガーがアクティブになります。同じテーブルに同じイベントを与えることはできません。 。
FOR EACH ROW -- トリガーの実行間隔: FOR EACH ROW 句は、テーブル全体に対して 1 回ではなく、1 行おきにアクションを実行するようにトリガーに通知します。
-- トリガーには、トリガーされる 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(&#39;商品1&#39;,10),(&#39;商品2&#39;,10),(&#39;商品3&#39;,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トリガーに関する質問

MySQLのインデックスとトリガーの詳細説明

MySQLのトリガーの操作例の詳細説明

以上がmysqlトリガーの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!