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 で特定のフィールドからスペースを一括削除する方法はありますか?文字列の前後のスペースだけ...

今日は、珍しいけれど役に立つJSテクニックをいくつか紹介します

1. 戻るボタンhistory.back() を使用してブラウザの「戻る」ボタンを作成します。 &l...

MySQL サーバー IO 100% 分析および最適化ソリューション

序文ストレス テスト中に、リソース使用のボトルネックによって発生する最も直接的なパフォーマンスの問題...

JS を使用してクリップボード内の Excel コンテンツを解析する方法

目次序文1. イベントとクリップボードを貼り付ける2. クリップボード内のコンテンツ形式3. HTM...

内部 IP アクセスのみを許可する Nginx プロキシ設定を追加する方法

位置 / { インデックス index.jsp; proxy_next_upstream http...

VMWare 仮想マシン 15.X LAN ネットワーク構成チュートリアル図

最近、分散型およびビッグデータ技術について学ぶために、いくつかの仮想マシンに取り組んでいます。まず、...

Docker クリーニングキラー/Docker オーバーレイ ファイルがディスク領域を大量に占有する

[インターネット上の移行ファイルをすべて見ると、信頼性が低く、症状のみを治療し、根本的な原因を治療し...

Reactのヒントはフックの依存関係の問題を解消する方法を教えます

reactプロジェクトで非常に一般的なシナリオ: const [watchValue、setWatc...

Vueパンくずコンポーネントのカプセル化方法

Vueはパンくずコンポーネントをカプセル化して参照します。具体的な内容は次のとおりです。効果を達成す...

MySQL オンラインリカバリ UNDO テーブルスペース 実戦記録

1 MySQL5.6 1.1 関連パラメータMySQL 5.6 では、innodb_undo_dir...

Vue のライフサイクルとフック関数

目次1.ライフサイクルとは何か2. Vueのライフサイクル3. ライフサイクルフック関数1.ライフサ...

HTML ブロックレベルタグとインラインタグの違い

1. ブロックレベル要素: 独立して存在できる能力を指します。通常、ブロックレベル要素は改行によって...

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者か...

Mysql 8.0.17 winx64バージョンのインストール中に発生した問題を解決する

1. my.iniファイルを手動で作成して追加する # クライアントセクション # --------...

ホバー生成の境界線によって生じる要素の移動を解決する方法

序文hover疑似クラスが要素に境界線を追加すると、要素内のコンテンツがずれることがあります。box...