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

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

    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 学習者の迅速な成長を支援します!