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はコンテナ外のコンテナ内でコマンドを実行します

推薦する

JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)

JSX を使用してコンポーネント システムを構築する前に、例を使用してコンポーネントの実装原理とロ...

Vueは秒殺しのカウントダウンコンポーネントを実装する

この記事では、2番目のキルカウントダウンコンポーネントを実装するためのVueの具体的なコードを参考ま...

MySQLデータベースのタイムアウト設定を構成する方法の例

目次序文1. JDBCタイムアウト設定2. 接続プールのタイムアウト設定3. MyBatisクエリの...

LinuxデバッガGDBの基本的な使い方の詳細な説明

目次1. 概要2. gdbデバッグ2.1. ブレークポイントを設定する2.1.1. ブレークポイント...

システム CD をマウントして yum ウェアハウスを構築する VMware 15.5 バージョンのグラフィック チュートリアル

1. CentOS 7 仮想マシンを開きます。 2. 仮想マシンにログインし、リストにないユーザー名...

CSSがページのレンダリングをブロックするかどうかについての簡単な説明

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...

SQL ファジー クエリ レポート: ORA-00909: パラメータの数が無効です。解決策

あいまいクエリにOracleデータベースを使用する場合、コンソール エラーは次の図に表示されます。理...

HTML 中国語文字エンコード標準の概要

HTML では、Web ページで使用されるエンコーディングを指定する必要があります。一般的な指定方法...

Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

Linux は現在最も広く使用されているサーバー オペレーティング システムです。Unix をベー...

docker ポートを追加して dockerfile を取得する方法

DockerイメージからDockerfileを取得する docker 履歴 --format {{....

モバイルデバイス上の 1px 境界線を解決する最善の方法 (推奨)

モバイル デバイス向けに開発する場合、Retina 画面上で要素の境界線が太くなるという問題に遭遇す...

VSCode の Remote-SSH を使用して Linux に接続し、リモート開発を行う

Remote-SSHをインストールして設定するまず VSCode を開き、拡張機能を見つけて、Rem...

Centos7環境でMySQL 5.6のインスタンスを複数作成する方法の詳細な説明

この記事では、CentOS 7 環境で MySQL 5.6 の複数のインスタンスを作成する方法につい...

光るテキストとちょっとしたJS特殊効果を実現するCSS

実装のアイデア: CSSでtext-shadowを使用してテキストの光る効果を実現します効果画像: ...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...