MySQLデータベースでトリガーを使用する方法

王林
リリース: 2023-05-28 17:31:06
転載
2359 人が閲覧しました

    1. 基本概念

    トリガーは特殊なタイプのストアド プロシージャであり、イベントによってトリガーされます。

    trigger トリガーは js events

    1 と似ています。機能

    • データテーブルに書き込む前にデータを強制的にチェックまたは変換します (データを確保するため)セキュリティ)

    • トリガー エラーが発生すると、変更の結果は取り消されます (トランザクションの安全性)

    • 一部のデータベース管理システムでは、次のように定義できます。データ用の言語 DDL は、DDL トリガーと呼ばれるトリガーを使用します

    • #特定の状況に応じて変更命令を置き換えることができます (mysql はサポートしていません)

    2. トリガーの長所と短所

    2.1. 利点
    • トリガーは、データベース内の関連テーブルを通じて段階的な変更を実現できます (テーブルのデータが変更された場合、トリガーを使用して他のテーブルに操作を実装できますが、ユーザーは知りません)

    • #データのセキュリティを確保し、セキュリティ検証を実行します
    • ##2.2. 欠点
    トリガーに過度に依存すると、必然的にデータベースの構造に影響があり、メンテナンスが複雑になります
    • プログラム レベルでデータを利用できなくなるコントロール
    • 2. トリガーの作成
    1. 基本構文

    create trigger 触发器名字 触发时机 触发事件 on 表 for each row begin end
    ログイン後にコピー

    2. テーブル上のトリガー オブジェクト

    各行

    トリガーはテーブル内のすべての行をバインドします。行に指定された変更が発生しない場合、トリガーがトリガーされます

    3. トリガーのタイミング

    各テーブルに対応する行さまざまな状態があります。SQL コマンドが発生すると、行内のデータが変更されます。各行には常に、データ操作前とデータ操作後の 2 つの状態があります。

    before :データ変更前の状態
    • after: データ変更後の状態
    • 4. トリガーイベント
    ターゲットmysql のトリガーの多くはデータの変更であり、対応する操作は書き込み操作 (追加、削除、変更) のみです。

    #不活性挿入操作

    • update 更新操作

    • 削除操作

    • 5. 注意事項

    • テーブルでは、各トリガー時間は、トリガー イベントに対応するトリガー タイプは 1 つだけです。

    テーブル内の挿入後トリガーに対応するトリガーは 1 つだけです。

    トリガーは最大 6 つまでしかありません

    before insert after insert before update after update before delete after delete
    ログイン後にコピー

    要件:

    #在庫を減らすために注文を行う
    テーブルが 2 つあり、1 つは製品テーブル、もう 1 つは注文テーブル (製品 ID を保持) ) 生成された注文ごとに、product テーブル内の対応する在庫が変更される必要があります。

    2 つのテーブルを作成します:

    create table my_item( id int primary key auto_increment, name varchar(20) not null, count int not null default 0 ) comment '商品表'; create table my_order( id int primary key auto_increment, item_id int not null, count int not null default 1 ) comment '订单表'; insert my_item (name, count) values ('手机', 100),('电脑', 100), ('包包', 100); mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 100 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec) mysql> select * from my_order; Empty set (0.02 sec)
    ログイン後にコピー

    トリガーを作成します:

    注文テーブルでデータ挿入が発生した場合、対応する製品の在庫を減らす必要があります

    delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 更新商品库存 update my_item set count = count - 1 where id = 1; end $$ delimiter ;
    ログイン後にコピー
    3. トリガーを表示します
    -- 查看所有触发器 show triggers\G *************************** 1. row *************************** Trigger: after_insert_order_trigger Event: INSERT Table: my_order Statement: begin update my_item set count = count - 1 where id = 1; end Timing: AFTER Created: 2022-04-16 10:00:19.09 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@localhost character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci Database Collation: utf8mb4_general_ci 1 row in set (0.00 sec) -- 查看创建语句 show crate trigger 触发器名字; -- eg: show create trigger after_insert_order_trigger;
    ログイン後にコピー

    4. トリガーをトリガーします

    トリガーを実行させ、トリガーで指定されたテーブルの対応する時間に対応する操作を発生させます

    #
    insert into my_order (item_id, count) values(1, 1); mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | +----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec)
    ログイン後にコピー

    5. トリガーの削除

    #
    drop trigger 触发器名字; -- eg drop trigger after_insert_order_trigger;
    ログイン後にコピー

    #6. トリガーの適用

    レコード キーワード new old

    6. 改善

    商品の在庫自動控除

    トリガーはデータ テーブル内の各レコードをターゲットにしており、データの各行には対応するステータス

    トリガーは実行前に対応するデータステータスを取得します:

    データステータスが取得される前にデータステータスを保存します。

      # 操作の
    • old

      キーワード後のステータスがnew

    • に配置されます。 ## トリガー コンテナーでは、old と new を使用して、バインディング テーブル内の対応するレコード データを取得できます。

      基本構文:

    Keyword.Field name

    新旧のすべてのトリガーに

    insert が挿入前に空であるわけではなく、old

    はありません

    削除クリアデータ、新規なし
    • アイテムが自動的に在庫を差し引く:
    • delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 通过new关键字获取新数据的id 和数量 update my_item set count = count - new.count where id = new.item_id; end $$ delimiter ;
      ログイン後にコピー

    • トリガートリガー:

    mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | +----+---------+-------+ mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 100 | | 3 | 包包 | 100 | +----+--------+-------+ insert into my_order (item_id, count) values(2, 3); mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | | 2 | 2 | 3 | +----+---------+-------+ mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 97 | | 3 | 包包 | 100 | +----+--------+-------+
    ログイン後にコピー
    2.最適化

    #在庫数量が製品の注文ほど多くない場合はどうすればよいですか?

    -- 删除原有触发器 drop trigger after_insert_order_trigger; -- 新增判断库存触发器 delimiter $$ create trigger after_insert_order_trigger after insert on my_order for each row begin -- 查询库存 select count from my_item where id = new.item_id into @count; -- 判断 if new.count > @count then -- 中断操作,暴力抛出异常 insert into xxx values ('xxx'); end if; -- 通过new关键字获取新数据的id 和数量 update my_item set count = count - new.count where id = new.item_id; end $$ delimiter ;
    ログイン後にコピー

    結果の検証:

    mysql> insert into my_order (item_id, count) values(3, 101); ERROR 1146 (42S02): Table 'mydatabase2.xxx' doesn't exist mysql> select * from my_order; +----+---------+-------+ | id | item_id | count | +----+---------+-------+ | 1 | 1 | 1 | | 2 | 2 | 3 | +----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from my_item; +----+--------+-------+ | id | name | count | +----+--------+-------+ | 1 | 手机 | 99 | | 2 | 电脑 | 97 | | 3 | 包包 | 100 | +----+--------+-------+ 3 rows in set (0.00 sec)
    ログイン後にコピー

    以上がMySQLデータベースでトリガーを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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