目次
1. 基本概念
1 と似ています。機能
各行
テーブル内の挿入後トリガーに対応するトリガーは 1 つだけです。
テーブルが 2 つあり、1 つは製品テーブル、もう 1 つは注文テーブル (製品 ID を保持) ) 生成された注文ごとに、product テーブル内の対応する在庫が変更される必要があります。
結果の検証:
ホームページ データベース mysql チュートリアル MySQLデータベースでトリガーを使用する方法

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

May 28, 2023 pm 05:31 PM
mysql trigger

    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 サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

    次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

    MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

    MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

    MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

    データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

    なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

    MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

    Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

    Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

    DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

    DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

    MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

    WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

    Centosはmysqlをインストールします Centosはmysqlをインストールします Apr 14, 2025 pm 08:09 PM

    CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

    See all articles