MySQL でのトリガーとカーソルの紹介と使用

MySQL でのトリガーとカーソルの紹介と使用

トリガーの紹介

トリガーは、テーブルに関連付けられた特別なストアド プロシージャであり、テーブル内のデータが挿入、削除、または変更されたときにトリガーされて実行されます。トリガーには、データベース自体の標準機能よりも高度で複雑なデータ制御機能があります。

トリガーの利点:

  • セキュリティ: データベースの値に基づいて、ユーザーにデータベースを操作するための特定の権限を与えることができます。たとえば、仕事が終わった後や休日にデータベースのデータを変更することは許可されません。
  • 監査: データベース上のユーザー操作を追跡できます。
  • 複雑なデータ整合性ルールを実装します。たとえば、トリガーは、マージンを超える先物取引の試みをロールバックすることができます。
  • スケジュールされたタスクを実行するための代替方法を提供します。例えば、会社の口座の資金が50,000元未満の場合、警告データがすぐに財務担当者に送信されます。

MySQL でのトリガーの使用

トリガーを作成する

トリガーを作成するコツは、トリガーの 4 つの要素を覚えておくことです。

  • 監視場所: テーブル;
  • 監視イベント: 挿入/更新/削除;
  • トリガー時間: 後/前;
  • トリガーイベント: 挿入/更新/削除。

トリガーを作成するための基本的な構文は次のとおりです。

トリガーを作成
-- trigger_name: トリガーの名前。 
-- tirgger_time: トリガー時間、BEFORE または AFTER;
-- trigger_event: トリガー イベント。INSERT、DELETE、または UPDATE のいずれかになります。 
 トリガー名 トリガー時間 トリガーイベント 
 の上
 -- tb_name: トリガーが作成されるテーブル名と、トリガーが作成されるテーブルを示します。
 tb_name
 -- FOR EACH ROW は、トリガー イベントを満たすレコードに対するすべての操作がトリガーをトリガーすることを意味します。
 各行ごとに
 -- trigger_stmt: トリガーの本体。単一の SQL ステートメント、または BEGIN と END で囲まれた複数のステートメントになります。 
 トリガーステートメント
  • trigger_name: トリガーの名前。
  • tirgger_time: トリガー時間(BEFORE または AFTER)。
  • trigger_event: トリガー イベント。INSERT、DELETE、または UPDATE のいずれかになります。
  • tb_name: トリガーが作成されるテーブル名と、トリガーが作成されるテーブルを示します。
  • trigger_stmt: トリガーの本体。単一の SQL ステートメント、または BEGIN と END で囲まれた複数のステートメントになります。
  • FOR EACH ROW は、トリガー イベントを満たすレコードに対するすべての操作がトリガーをトリガーすることを意味します。

注意: 同じテーブル内の同じトリガー時間を持つ同じトリガー イベントに対しては、トリガーを 1 つだけ定義できます。

新しいレコードと古いレコードをトリガーする

NEW と OLD は、トリガーが配置されているテーブル内でトリガーをトリガーしたデータの行を示すために MySQL で定義されています。

  • INSERT トリガーでは、NEW は、これから挿入される新しいデータ (BEFORE) または既に挿入されている新しいデータ (AFTER) を示すために使用されます。
  • UPDATE トリガーでは、OLD は変更される予定または変更された元のデータを示すために使用され、NEW は変更される予定または変更された新しいデータを示すために使用されます。
  • DELETE トリガーでは、OLD は元のデータが削除されようとしているか、または削除されたことを示すために使用されます。

ユーザーが製品を購入したときに対応する製品在庫レコードを更新するトリガーを作成します。コードは次のとおりです。

-- トリガーを削除します。トリガー名をドロップします -- 存在する場合は、存在する場合にのみ削除されます。ドロップ トリガーが存在する場合、myty1 が存在する場合;
-- トリガーを作成します。create trigger mytg1 -- myty1 トリガーの名前 after insert on orders -- トリガーを作成するテーブルを指定します。
各行ごとに
始める
	製品セット num を num-new.num に更新します (pid は new.pid です)。
終わり;
--注文テーブルにレコードを挿入します。 insert into orders values(null,2,1);
-- 製品テーブル内の製品の在庫更新ステータスを照会します。select * from product;

ユーザーが注文を削除したときに対応する製品在庫レコードを更新するトリガーを作成します。コードは次のとおりです。

-- トリガーを作成する トリガーを作成する mytg2
注文の削除後
各行ごとに
始める 
-- インベントリをロールバックし、更新製品を再度追加します。セット num = num+old.num、pid=old.pid;
終わり;
-- 注文レコードを削除します。delete from orders where oid = 2;
-- 製品テーブル内の製品の在庫更新ステータスを照会します。select * from product;

以前と以後の違い

before ステートメントを実行する前 after ステートメントを実行した後

注文数量が在庫を超える場合は、注文数量を最大在庫に合わせて変更します。

-- -- 事前トリガーを作成する create trigger mytg3
注文に挿入する前に
各行ごとに 
始める 
	-- 在庫を受け取る変数を定義します。declare n int default 0;
	-- 在庫を照会し、num を n に割り当てる
	pid = new.pid の場合、製品から num を n に選択します。
	-- 注文数量が在庫より大きいかどうかを判定します。new.num>nの場合、
		-- 変更注文在庫より大きい(在庫が最大数量に変更されました)
	new.num = n を設定します。
	終了の場合;
	製品セット num を num-new.num に更新します (pid は new.pid です)。
終わり;
--注文テーブルにレコードを挿入します。 insert into orders values(null,3,50);
-- 製品テーブル内の製品の在庫更新ステータスを照会します。select * from product;
-- 注文テーブルを照会します。select * from orders;

カーソル

カーソルの紹介

カーソルの機能は、データベースを照会して返されたレコードを走査し、対応する操作を実行することです。カーソルには次の特性があります。

  • カーソルは読み取り専用であるため、更新できません。
  • カーソルはスクロールできません。つまり、カーソルは一方向にのみ移動でき、レコード間を自由に前後に移動したり、特定のレコードをスキップしたりすることはできません。
  • カーソルが開いているテーブルのデータを更新しないでください。

カーソルの作成

カーソルを作成するための構文は、次の 4 つの部分で構成されます。

  • カーソルを定義します: カーソル名を宣言し、select ステートメントにカーソルを指定します。
  • カーソルを開きます: open cursor name;
  • 結果を取得: カーソル名を変数名 [, 変数名] に取得します。
  • カーソルを閉じる: カーソル名を閉じる;

カーソルを使用して、テスト データベースの学生テーブルの最初の学生情報を返すプロシージャ p1 を作成します。コードは次のようになります。

-- プロシージャを定義する create procedure p1()
始める 
	id int を宣言します。
	名前を宣言するvarchar(20);
	age int を宣言します。
	-- カーソルを定義します。カーソル名を宣言します。カーソルは select ステートメント用です。
	select * from student の mc カーソルを宣言します。
	-- カーソルを開きます open cursor name;
	オープンMC;
	-- カーソル名を変数名 [, 変数名] に取得します。
	mc を id、name、age に取得します。
	-- 選択した ID、名前、年齢を印刷します。
	-- カーソルを閉じる close mc;
終わり;
-- プロシージャを呼び出します call p1();

テスト データベースに student2 テーブルを作成し、プロシージャ p2 を作成し、カーソルを使用して student テーブルからすべての学生情報を抽出し、それを student2 テーブルに挿入します。コードは次のようになります。

-- プロシージャを定義する create procedure p3()
始める 
	id int を宣言します。
	名前を宣言するvarchar(20);
	age int を宣言します。
	フラグ int のデフォルトを 0 として宣言します。
	-- カーソルを定義します。カーソル名を宣言します。カーソルは select ステートメント用です。
	select * from student の mc カーソルを宣言します。
	見つからない場合の継続ハンドラを宣言し、フラグを 1 に設定します。
	-- カーソルを開きます open cursor name;
	オープンMC;
	-- カーソル名を変数名 [, 変数名] に取得します。
	a:loop -- データを取得するためのループ fetch mc into id,name,age;
	フラグが1の場合、フェッチが失敗したときに継続ハンドラをトリガーします。
	leave a;-- ループを終了する end if;
	-- 抽出されたデータの各行を走査して student2 テーブルに挿入します。 insert into student2 values(id,name,age);
	ループを終了します。
	-- カーソルを閉じる close mc;
終わり;
-- プロシージャ call p3() を呼び出します。
-- student2 テーブルをクエリします。select * from student2;

要約する

これで、MySQL のトリガーとカーソルに関するこの記事は終了です。MySQL のトリガーとカーソルに関する関連情報をさらに知りたい場合は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLシリーズ5つのビュー、ストアド関数、ストアドプロシージャ、トリガー
  • MySQLトリガーの使用
  • MySQLトリガーの例の詳細な説明
  • MySQLトリガーの使用と理解
  • MySQLトリガーについて深く理解するための記事

<<:  スクラッチ宝くじの例を実現する JavaScript キャンバス

>>:  CSS 兄弟要素フローティング分析の概要

推薦する

MySQL 作成ルーチン権限に関する注意事項

1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

Nginx アクセス ログとエラー ログ パラメータの説明

例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...

ウェブページにコンテンツが多すぎる場合に、下から上へ素早く戻る方法

Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...

SQL 面接の質問: 時間差の合計を求める (重複は無視)

ある会社の BI 職の面接を受けたとき、面接で SQL に関する質問がありました。一見すると非常に簡...

Vue でログインと登録テンプレートを実装するためのサンプルコード

テンプレート 1: ログイン.vue <テンプレート> <p class=&quo...

Linux コマンドを使用してオーディオ形式を変換および結合する方法

FFmpeg flacをインストールする eric@ray:~$ sudo apt install ...

VMware ESXi6.7 の簡単なセットアップ(画像とテキスト付き)

1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...

React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

目次使用インストールルーティングでどのように使用しますか?読み込み速度の比較最近、中間およびバックエ...

Linux での Apache サービスの展開と構成

目次1 Apacheの役割2 Apacheのインストール3. Apacheを有効にする4 Apach...

MySQLリモート接続を有効にする方法

セキュリティ上の理由から、MySql-Server はローカル マシン (localhost、127...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

JavaScript 文字列操作の 4 つの実用的なヒント

目次序文1. 文字列を分割する2. JSONのフォーマットと解析3. 複数行の文字列と埋め込み式4....

line-height=height要素の高さだがテキストが垂直方向に中央揃えされない問題を解決する

まず、行の高さが要素の高さと等しい場合にテキストが垂直方向に中央揃えにならない理由を説明します。実際...

Tomcatのクラスロードメカニズムのプロセスとソースコード分析

目次序文1. Tomcat クラスローダー構造図: 2. Tomcat のクラスロードプロセスの説明...