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 バージョンのインストールと使用方法 (画像とテキスト)

ブログ    

推薦する

js でパズルゲームを実装する

この記事では、パズルゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内容は...

CSS3 で虫眼鏡効果を模倣するいくつかの方法の原理の分析

記事のタイトルが「模造虫眼鏡」なのはなぜですか?今日お話ししたいのは、一般的に言われているような、マ...

Linux ファイルとユーザー管理の実践

1. /etc ディレクトリ内の、文字以外の文字で始まり、その後に文字と任意の長さのその他の文字が続...

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

Node.js での SerialPort モジュールの使用

目次目的モジュールのインストール基本的な使い方ポートをスキャンする開いているポートデータの送信データ...

MySQLにインデックスを追加する方法

インデックスの簡単な紹介は次のとおりです。インデックスを追加する目的は、データベース クエリのパフォ...

Net Core実装プロセス分析のDoc​​kerインストールと展開

1. Dockerのインストールと設定 #CentOS をインストールし、Docker パッケージを...

href をクリックした後にページがジャンプしないようにするための空のリンクの正しい書き方 # 問題

リンクを使用する必要がある場合もありますが、リンクする必要はありません。onclick イベントを処...

Docker Swarmの概念と使用法の詳細な説明

Docker Swarm は、Docker によって開発されたコンテナ クラスター管理サービスです。...

Vue.jsでタブ切り替えと色変更操作を実装する解説

この機能を実装するにあたり、本家ブロガーさんから拝借した方法では色の切り替えが実現できず、長い間考え...

Vueのカスタムディレクティブの詳細なガイド

目次1. カスタム指示とは何ですか? 2. 指示をカスタマイズする方法フック機能3. 応用シナリオ入...

CSSでイメージマッピングを実装する方法

1. はじめにイメージマップを使用すると、画像の領域をホットスポットとして指定できます。この領域にマ...

WEB2.0の片手ルール

<br />前回のCSSに関する記事は、多くの人にあまり理解されませんでした。そのため、...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...