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

推薦する

Jenkins の Docker のデプロイとインストール手順

まず、Docker がインストールされたサーバーが必要です。 (私はすでにこれをサーバーにインストー...

ウェブマスターが注目すべき、ウェブサイトのユーザビリティを向上させる 9 つのコード最適化のヒント

1. ロゴに代替テキストを追加するこれには 2 つの利点があります。スクリーン リーダーがロゴ画像の...

イントラネット侵入を実現するためのSSHポート転送

LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...

MySQL の自動インクリメント主キーが連続していないのはなぜですか?

目次1. はじめに2. 自己増分ストレージの説明3つの自己付加価値修正メカニズム4. 自己評価を修正...

HTML でマウスが停止したときに行全体の色 (tr) を変更する方法

純粋な CSS を使用して、マウスが行の上を通過するときに行の背景色を変更し、その行にフォーカスがあ...

Vueコンポーネントの再利用と拡張の詳細な説明

目次概要延長は必要ですか?スロットJavaScript ユーティリティ関数拡張コンポーネントの複数の...

MySQL 5.7 解凍版のインストールとアンインストール、およびよくある問題の概要

1. インストール1. ダウンロードMySQLをダウンロードするには、MySQL公式サイトhttp:...

ReactでCSSスタイルを動的に変更する2つの方法の詳細な説明

最初の方法: デモとしてボタンをクリックしてテキストを表示または非表示にするクラスを動的に追加します...

手書きの Vue2.0 データハイジャックの例

目次1: webpackをビルドする2. データハイジャック3: まとめ1: webpackをビルド...

XHTML チュートリアル: Transitional と Strict の違い

実際、XHTML 1.0 は、Transitional DOCTYPE と Strict DOCTY...

Vue+EChartsは、中国の地図の描画と省の自動回転と強調表示を実現します。

目次成果を達成する完全なコード + 詳細なコメントまとめ成果を達成する完全なコード + 詳細なコメン...

webpackでHMRを手動で実装するいくつかの方法

目次1. はじめに2. GitHub 3. 基本構成プロジェクトディレクトリパッケージ.json c...

Javascript における非同期待機の詳細な理解

この記事では、async/await がすべての JavaScript 開発者にとって非同期プログラ...

Ubuntu 18.04 MySQL 8.0 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0のインストールと設定方法を参考までに紹介します。具体的な内容は以下の...

MySQLデータベースの増分バックアップのアイデアと方法

MySQL データベースの増分バックアップを実行するには、データベース構成ファイル /etc/my....