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 インデックスの原理と使用例の分析

この記事では、例を使用して MySQL インデックスの原理と使用方法を説明します。ご参考までに、詳細...

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

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

MySQL マスタースレーブレプリケーションでエラーをスキップする方法

1. 従来のbinlogマスタースレーブレプリケーション、エラー報告をスキップする方法 mysql&...

HTMLベースの複数画像アップロードのプレビュー機能を実装

最近、Web ページに複数の画像をアップロードするためのスクリプトを作成しました。これは非常に実用的...

HTMLでのフォーム送信の実装

フォーム送信コード1. ソースコード分析 <!DOCTYPE html> <htm...

GoのDockerデプロイメント用の基本イメージ2つの実装

1. golang:最新のベースイメージ mkdir gotest タッチメイン.go Docker...

WeChatアプレットに2048ミニゲームを実装する詳細なプロセス

レンダリング サンプルコード今日は、WeChat アプレットを使用して 2048 ゲームを実装します...

MySQL 結合クエリの原則の知識ポイント

MySQL 結合クエリ1. 基本概念2 つのテーブルの各行をペアで水平に接続して、すべての行の結果を...

Alibaba Cloud ECS サーバーでポート 8080 を開く方法

セキュリティ上の理由から、Alibaba Cloud Server ECS にはデフォルトで独自のセ...

小さなページングデザイン

ユーザーが目的のものを探すために前進するか後退するかを選択できるようにします。たとえば、Taobao...

Bツリーの特性の紹介

B ツリーは一般的なデータ構造です。彼と一緒にB+ツリーがあります。ここで、概念を明確にする必要があ...

CSS3で実装された6つの境界遷移効果

6つの効果実装コードhtml <h1>CSS 境界遷移</h1> <セ...

小規模プログラムへのデータキャッシュ機構の応用と実装

ミニプログラムデータキャッシュ関連知識データ キャッシュ: データをキャッシュして、アプレットを終了...

Linux で推奨される 9 つの優れたコード比較ツールの概要

コードを書くとき、2 つのファイル間の違い、または同じファイルの異なるバージョン間の違いを知る必要が...

Reactの二次連携を実現する方法

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...