MySQLトリガーの概念、原理、使用法の詳細な説明

MySQLトリガーの概念、原理、使用法の詳細な説明

この記事では、例を使用して、MySQL トリガーの概念、原則、および使用方法を説明します。ご参考までに、詳細は以下の通りです。

1. トリガーの概念

トリガーは、データの整合性を確保するために MySQL がプログラマーやデータ アナリストに提供する方法です。これは、テーブル イベントに関連する特別なストアド プロシージャです。トリガーの実行は、プログラムによって呼び出されたり、手動で開始されたりするのではなく、イベントによってトリガーされます。たとえば、テーブルに対して操作 (挿入、削除、更新) が実行されると、トリガーがアクティブになります。 ——百度百科

上記は、Baidu が提示したトリガーの概念です。トリガーの概念について私が理解しているのは、SQL ステートメントを実行すると、この SQL ステートメントの実行によって他の SQL ステートメントの実行が自動的にトリガーされるということです。とても簡単です。

非常にシンプルな説明: sql1->trigger->sqlN、1つのsqlが複数のsqlをトリガーします

2. トリガー作成の4つの要素

(1)監視場所(表)
(2)イベント監視(挿入・更新・削除)
(3)トリガー時間(後/前)
(4)トリガーイベント(挿入/更新/削除)

3. トリガーを作成する

需要: 注文を行うと、対応する商品の在庫がそれに応じて削減される必要があります。つまり、購入された商品の数だけ在庫が削減される必要があります。

注文表: ord
商品表: 商品

まず、テーブルを作成し、データを追加します。

テーブル商品を作成する(
  gid int、
  名前varchar(20),
  数値小数点
);
テーブル ord を作成する(
  oid int、
  gid int、
  非常に小さい
);
商品に値(1,'cat',40)を挿入します。
商品に値(2,'dog',63)を挿入します。
商品に値(3,'pig',87)を挿入します。

次に、トリガー作成の 4 つの要素に従って分析します。

  • 監視対象: ord (注文テーブル)
  • 監視アクション: 挿入 (挿入操作)
  • トリガー時間: after (挿入操作後にトリガー)
  • トリガーイベント: 更新 (更新操作をトリガー)

最後にトリガーを作成します。

トリガー t1 を作成する 
後
入れる 
オンオード
各行ごとに
始める
 gid = 1 の場合、商品セット num=num-2 を更新します。
終了$

分析: トリガーの名前は t1、トリガー時間は after、監視アクションは insert、ord テーブルの監視、各行については最後に説明します。ここでは覚えておいてください。begin と end の間にトリガー イベントを記述します。ここに更新ステートメントがあります。つまり、どのような注文をしても、商品番号 1 の商品の在庫数は 2 減少します。

注意: MySQL のデフォルトの実行終了マークは ; であるため、上記のコードを最初に実行しないでください。上記の SQL 文を実行すると、MySQL は ; に遭遇すると自動的に実行を停止し、end 文は実行されません。そのため、まずは MySQL の終了識別子を他の文字に変更する必要があります。一般的には、$ または $$ が使用されます。ここでは、実行の終了識別子として $ が使用されます。 MySQL 実行の終了マークを変更するには、次のステートメントを使用します。

delimiter $ //MySQL 実行終了マークを設定します。デフォルトは;

4. 既存のトリガーを表示および削除する

(1)既存のshow triggers
(2)既存のトリガーを削除する: drop trigger triggerName

5. トリガー内の行変数を参照する

(1) トリガーターゲットで挿入操作を実行すると、新しい行が作成されます。トリガーイベントで新しい行の変数が必要な場合は、new キーワードを使用してこれを示すことができます。 (2) トリガーターゲットで削除操作を実行すると、古い行が作成されます。トリガーイベントで古い行の変数が必要な場合は、old キーワードを使用してこれを示すことができます。 (3) トリガーターゲットで更新操作を実行すると、元のレコードが古い行になり、新しいレコードが新しい行になります。new キーワードと old キーワードを使用して、それぞれ操作することができます。

注文が行われると、対応する商品の在庫を減らし、トリガーを作成します。

トリガー t2 を作成する
後
入れる 
オンオード
各行ごとに
始める
 商品を更新します。num=num-new.much、gid=new.gid を設定します。
終了$

注文を削除する場合は、対応する変更された商品の在庫を増やし、トリガーを作成します。

トリガー t3 を作成する
後
消去
オンオード
各行ごとに
始める
 商品を更新します。num=num+old.much、gid=old.gid です。
終了$

注文の購入数量が更新されると、対応する商品の在庫数量が変更され、トリガーが作成されます。

トリガー t4 を作成する
前に 
アップデート
オンオード
各行ごとに
始める
 商品を更新します。num=num+old.much-new.much、gid = new.gid;
終了$

6. 後と前の違い

after 操作は、監視アクションが実行された後にイベントをトリガーします。
before 操作は、監視アクションが実行される前にトリガー イベントを実行します。一般的なトリガーでは 2 つに違いはありませんが、次のような違いがある場合もあります。

要件: ユーザーが在庫を超える注文をすると、最大注文数量が在庫と同じになるように注文の注文数量が変更されます。分析: まず注文数量 > 在庫かどうかを判断し、次に注文数量を在庫に変更します。

トリガーを作成します。

トリガー t5 を作成する
前に
入れる 
オンオード
各行ごとに
始める
 restNum int を宣言します。
 gid = new.gid である goods から num を restNum に選択します。
 new.much > restNum の場合
   new.much = restNum; を設定します。
 終了の場合;
 商品を更新します。num=num-new.much、gid=new.gid を設定します。
終了$

注意: ここで after を使用すると、エラーが報告されます。 after を使用すると、最初に挿入操作が実行され、つまり注文操作が挿入され、次に注文数量と在庫が判断されて新しい注文数量が取得されます。ただし、注文操作は実行されているため、エラーが報告されます。ここでは before 操作を使用する必要があります。

7. 各行の目的は何ですか?

Oracleトリガーでは、トリガーは行トリガーと文トリガーに分けられます。

例えば:

トリガーtnを作成
後
アップデート
xxtableで
各行 #各行が影響を受け、行トリガーと呼ばれるトリガーイベントが実行されます
 sqlN;
終了$

埋め込む:

xxtable を更新し、id>100 の場合に xxx=xxx を設定します。

変更操作に 100 行が関係すると仮定すると、sqlN は何回トリガーされますか?回答: 100 回発動します。

拡大する:

Oracle では、for each row が記述されていない場合、更新ステートメントによって一度に影響を受ける行の数に関係なく、トリガー イベントは 1 回だけ実行されます。
たとえば、ある人が注文して 5 つのアイテムを購入し、それを 5 回挿入した場合、行レベルのトリガーを使用して在庫を 5 回変更できます。また、ステートメント レベルのトリガーを使用して、出荷リマインダーを挿入することもできます。
残念ながら、MySQL は現在ステートメント レベルのトリガーをサポートしていません。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL トリガーの使用シナリオとメソッドの例
  • MySQLデータベーストリガーの詳細な説明
  • MySql ビュー、トリガー、ストアド プロシージャに関する簡単な説明
  • mysql トリガーの作成と使用例
  • MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明
  • MySQL トリガーの追加、削除、変更、クエリ操作の例
  • MySQL トリガー: 複数のトリガー操作の作成例の分析
  • MySQL トリガーの定義と使用方法の簡単な例
  • MySQLトリガーの使用と注意すべき点

<<:  React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド

>>:  Ubuntu 18.04 Server バージョンのインストールと使用方法 (画像とテキスト)

推薦する

DIV、テーブル、XHTML のウェブサイト構築の違いの分析と説明

簡単に言えば、ウェブサイト構築とは、「この人はどんな外見をしているのか」と「この人はどんな内面を持っ...

MySQL の group by に関する簡単な説明

目次1. はじめに2. ユーザーテーブルを準備する2.1 グループ化ルール2.2 グループの使用2....

MySQL インストール図の概要

MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...

Vue の新しい組み込みコンポーネントの使用方法の詳細な説明

目次1. テレポート1.1 テレポートの紹介1.2 テレポートの使用1.3 プレビュー効果2. サス...

CentOS 7.6 Telnetサービス構築プロセス(Opensshアップグレードバトル第一弾のバックアップトランスポートライン構築)

不明な点があるときはいつでも、Blog Park にアクセスして、いつでも答えやインスピレーションを...

大規模な MySQL テーブルに対する count() の実装を最適化しました

以下は、B+ ツリーのデータ構造と実験結果からの推測に基づいた私の判断です。間違いがあればご指摘くだ...

Angular Cookie の読み取りおよび書き込み操作コード

Angular Cookie の読み取りおよび書き込み操作のコードは次のようになります。 var a...

Dockerコンテナを使用してプロキシ転送とデータバックアップを実装する方法

序文アプリケーションを Docker コンテナとしてサーバーにデプロイする場合、通常はネットワークと...

docker tagとdocker pushの使い方の詳しい説明

Dockerタグの詳しい説明docker tag コマンドの使い方と、ローカルイメージを daocl...

CSSスコープ(スタイル分割)の使用の概要

1. CSSスコープの使用(スタイル分割) Vue では、CSS スタイルを現在のコンポーネントでの...

Zabbixについて管理者ログインパスワードを忘れた場合、パスワードをリセットする

Zabbix 管理者ログイン パスワードのリセットに関する問題は次のとおりです。 1. 問題の説明:...

mysqlはストアドプロシージャを使用してツリーノード取得メソッドを実装します。

図に示すように: テーブルデータこのようなツリーの場合、「Gao Yinrui」の下のすべてのノード...

レスポンシブWebデザイン学習(2) — 動画をレスポンシブにすることはできるのか?

前回のエピソードレビュー:昨日は、ページがさまざまなデバイス サイズにどのように対応するかについて説...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...