MySQL トリガーの使用シナリオとメソッドの例

MySQL トリガーの使用シナリオとメソッドの例

トリガー:

トリガーの使用シナリオと対応するバージョン:

トリガーは次の MySQL バージョンで使用できます。

  • バージョン: MySQL5以上

使用シナリオの例:

  1. 顧客がデータベース テーブルに追加されるたびに、電話番号が正しい形式であること、および州の略語が大文字になっていることを確認します。
  2. 商品が注文されるたびに、注文数量が在庫数量から差し引かれます。
  3. 行が削除されるたびに、そのコピーがアーカイブテーブルに保存されます。

つまり、テーブルが変更されると自動的に処理されます。

「トリガーから結果セットを返すことは許可されていません」というトリガー エラーが発生した場合は、最後までスクロールして詳細を確認してください。

トリガーの使用:

基本的なトリガーを作成します。

各行のproductsにINSERT後にトリガーnewproductを作成する
始める
 msg VARCHAR(100)を宣言します。
 SET msg = "製品が追加されました";
 シグナルSQLSTATE 'HY000' SET message_text = msg;
 
終わり

結果:

製品に値を挿入します('demo2','1003','xiaoguo','66.6','hello world')
> 1644 - 製品が追加されました
> 時間: 0.035秒

説明する:

まずトリガーを作成します。

#newproduct トリガーの名前 CREATE TRIGGER newproduct

トリガータイミング:

BEFORE: トリガーは、それを起動したステートメントの前に起動されます。

AFTER: トリガーは、トリガーを起動したステートメントが完了した後に起動します。

ここでは after を使用します。つまり、トリガー条件は挿入が完了した後です。

msg VARCHAR(100)を宣言します。

注意: 宣言文は複合文で変数を宣言する命令です。msg が宣言されていない場合、MySQL は文の実行時にエラーを報告します。

シグナルSQLSTATE 'HY000' SET message_text = msg;

SIGNAL ステートメントが特定の SQLSTATE 値を示している場合、その値は指定された条件を表すために使用されます。

「HY000」は「一般エラー」と呼ばれます。

コマンドで一般的なエラーが発生した場合、次のメッセージが表示されます。

注: この記述はあくまでも私の個人的な理解であり、限られた理解しかありません。もっと良い説明があれば、メッセージを残してください。

トリガー条件は BEGIN で始まり、END で終わります。

トリガーイベント:

  1. 入れる
  2. アップデート
  3. 消去

トリガーを削除するには:

-- トリガーを削除します DROP TRIGGER newproduct;

INSERTトリガー:

挿入トリガーは、挿入ステートメントの実行前または実行後に実行されます。次の点に注意してください。

  1. 挿入トリガー コード内。挿入された行にアクセスするには、NEW という名前の仮想テーブルを参照できます。
  2. 挿入前トリガーでは、NEW の値も更新できます (挿入された値を変更できるようになります)
  3. AUTO_INCREMENT 列の場合、挿入が実行される前は NEW に 0 が含まれ、挿入が実行された後は自動的に生成された新しい値が含まれます。

例: 新しい注文を挿入するときに、新しい注文番号を生成し、order_numに保存します。

各行の注文の挿入後にトリガー neworder を作成します。
 NEW.order_num を @ee に選択します。

注文に INTO を挿入します(注文日、顧客 ID) VALUES(NOW()、10001);
@ee を num として選択します。

TRIGGER neworder を削除します。

説明する:

挿入後、および挿入された行ごとに実行される neworder トリガーを作成します。挿入では、NEW で表される orders テーブルとまったく同じ仮想テーブルがあります。

NEW.order_num を @a に選択します。

仮想テーブルに挿入したデータの数を見つけて、その数を変数に保存します。

検出:

注文に INTO を挿入します(注文日、顧客 ID) VALUES(NOW()、10001);
@ee を num として選択します。

データを挿入し、挿入されたデータの数を出力する

消去:

TRIGGER neworder を削除します。

トリガーを削除します。

例2:

COURSE テーブルにトリガーを作成し、挿入時に同じコース名のレコードがあるかどうかを確認します。ある場合、アクションは実行されません。

トリガー trg_course_in を作成する 
挿入前コース
各行ごとに
始める
  msg VARCHAR(100)を宣言します。 
  存在する場合(cname=NEW.cnameのコースから*を選択) 
   SET msg = '同じ名前のコースには参加できません'; 
   シグナルSQLSTATE 'HY000' SET message_text = msg; 
  終了の場合; 
 
終わり

例 3: 学生テーブルに情報を挿入するときに、ssex の値が男性または女性である必要があることを確認します。

各行ごとに学生の INSERT 後にトリガー trg_ssex を作成します。
始める
 msg VARCHAR(100)を宣言します。
 IF(NEW.ssex が('男','女')に含まれない場合) THEN
 SET msg = '性別は男性または女性でなければなりません'; 
 シグナルSQLSTATE 'HY000' SET message_text = msg;
 終了の場合
終わり

UPDATEトリガー:

  1. 更新トリガーのコードでは、OLD という名前の仮想テーブルを参照して以前の値、つまり更新が実行される前の値にアクセスしたり、NEW という名前の仮想テーブルを参照して新しく更新された値にアクセスしたりすることができます。
  2. 更新前トリガーでは、NEW の値も更新される場合があります (更新ステートメントで使用される値の変更を許可します)。
  3. OLD 内のすべての値は読み取り専用であり、更新できません。

例1: 州の略語が大文字になっていることを確認する

ベンダーの UPDATE 前に UPDATE トリガーを作成する
各行にnew.vend_state =UPPER(new.vend_state);を設定します。

ベンダーを更新し、vend_state='hw' を設定します。ただし、vend_id='1001' です。
DROP TRIGGER UPDATEevendor;

注: upper: はテキストを大文字に変換します。

例 2: 学生テーブルの学生 ID sno を変更することはできません。この列を変更すると、エラー メッセージが表示され、操作はキャンセルされます。

更新前にトリガー trg_student_updateSno を作成
各行ごとに
始める
 msg VARCHAR(100)を宣言します。 
 NEW.sno <> OLD.sno の場合 
 SET msg = 'sno の変更は許可されていません'; 
 シグナルSQLSTATE 'HY000' SET message_text = msg; 
 終了の場合; 
終わり

DELETEトリガー:

DELETE トリガーは、削除ステートメントの実行前または実行後に実行されます。

  1. 削除トリガー コードでは、OLD の仮想テーブルを参照して削除された行にアクセスできます。
  2. OLDのすべての値は読み取り専用であり、更新できません

例:

アーカイブテーブルに削除する行を保存するには、old を使用します。

まず、注文に似たテーブルを作成します。

テーブル archive_orders を orders のように作成します。
-- 削除トリガーを作成します。CREATE TRIGGER deleteorder BEFORE DELETE on orders
各行の開始
archive_orders(order_num,order_date,cust_id) に VALUES(old.order_num,old.order_date,old.cust_id) を挿入します。
終わり

説明する:

注文テーブルの行の情報を削除する場合は、削除した情報を archive_orders に保存します。

元のテーブルから行を削除します。

order_num='20014' である orders から削除します。

効果をご覧ください:

archive_orders から * を選択します。

仕上げる:

注意: トリガーエラー「トリガーから結果セットを返すことは許可されていません」が発生した場合

  1. 理由: MySQL 5 以降、トリガーは結果セットを返すことがサポートされていません。
  2. 解決策: 次の文の後に@変数名を追加します
  3. データを取得: @変数名を選択

詳しい説明: https://www.programmersought.com/article/3237975256/

ユーザー変数を作成する: https://www.jb51.net/article/201843.htm

これで、MySQL トリガーの使用シナリオと使用方法についての記事は終了です。MySQL トリガーの使用に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLトリガーの例の詳細な説明
  • MySQL でのトリガーとカーソルの紹介と使用
  • MySQLトリガーの使用と理解
  • MySQLでカーソルトリガーを使用する方法
  • MySQLトリガーの使用と注意すべき点
  • MySQLデータベーストリガーの詳細な説明
  • MySql ビュー、トリガー、ストアド プロシージャに関する簡単な説明
  • mysql トリガーの作成と使用例
  • MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明
  • MySQLトリガーの使用

<<:  HTMLは実際にはいくつかの重要なタグを学ぶアプリケーションです

>>:  Dockerはコンテナ外のコンテナ内でコマンドを実行します

推薦する

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...

NexusはHTTPSプロトコルをサポートするためにnginxプロキシを使用します

背景すべての会社の Web サイトは HTTPS プロトコルをサポートする必要があります。Aliba...

vue $http の get および post リクエストのクロスドメイン問題を解決する

Vue $http get および post リクエストのクロスドメイン問題まずconfig/ind...

CSS と Bootstrap アイコンを使用して、上下にジャンプするインジケーター矢印のアニメーション効果を作成します。

ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...

MySQL でのサブクエリの基本的な使用法

目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...

カルーセルの制作方法を実現するjs

この記事では、カルーセル画像の表示を実現するためのjsの具体的なコードを参考までに共有します。具体的...

Linux で Golang をインストールする方法

Go は、シンプルで信頼性が高く、効率的なソフトウェアを簡単に構築できるオープンソース プログラミン...

WEBAPP開発スキルのまとめ(モバイルWebサイト開発の注意点)

1. レスポンシブな Web を開発するには、ページを画面サイズに適応させる必要があります。前の記...

HTML の doctype とエンコーディングに関する簡単な説明

文書タイプDoctype は、指示を解析するためにどのバージョンの HTML を使用するかをブラウザ...

Linux環境変数の設定に関する完全なガイド

Linux環境変数の設定ソフトウェアのインストールをカスタマイズする場合、多くの場合、環境変数を設定...

インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント

目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...

MIME TYPEとは?MIME-Typesタイプコレクション

MIME タイプとは何ですか? 1. まず、ブラウザがコンテンツを処理する方法を理解する必要がありま...

Linux 名前空間ユーザーの詳細な説明

ユーザー名前空間は Linux 3.8 で追加された新しい名前空間で、ユーザー ID やグループ I...

JavaScript デザインパターン プロキシパターンの学習

目次概要実装保護エージェント仮想エージェント画像の遅延読み込みを実現する仮想プロキシ概要プロキシ パ...