MySQL トリガーの使用方法と利点と欠点の紹介

MySQL トリガーの使用方法と利点と欠点の紹介

序文

実際の開発では、2 つ以上の相互に関連するテーブルがあり、たとえば、製品情報と在庫情報が 2 つの異なるデータ テーブルに格納されているような状況によく遭遇します。新しい製品レコードを追加する場合、データの整合性を確保するために、在庫テーブルに在庫レコードも追加する必要があります。

この場合、これら 2 つの関連する操作ステップをプログラムに記述し、トランザクションでラップして、2 つの操作がアトミック操作 (すべてが実行されるか、まったく実行されないかのいずれか) になるようにする必要があります。

特殊な状況に遭遇した場合、データを手動で保守する必要がある場合があり、手順の 1 つを忘れてデータが失われる可能性が高くなります。このとき、トリガーを使用できます。

商品情報データの挿入操作によって在庫データの挿入操作が自動的にトリガーされるようにトリガーを作成できます。こうすることで、在庫データの追加を忘れてデータが失われることを心配する必要がなくなります。

1. トリガーの概要

MySQL はバージョン 5.0.2 以降でトリガーをサポートしています。 MySQL トリガーは、ストアド プロシージャと同様に、MySQL サーバーに埋め込まれたプログラムです。

トリガーは、INSERT、UPDATE、DELETE イベントなどのアクションをトリガーするイベントです。イベントとは、ユーザーのアクションまたは動作のトリガーを指します。トリガーが定義されている場合、データベースがこれらのステートメントを実行すると、イベントが発生したことになり、トリガーが自動的にトリガーされて対応する操作が実行されます。データ テーブルにデータを挿入、更新、削除し、一部のデータベース ロジックを自動的に実行する必要がある場合は、トリガーを使用してそれを実装できます。

2. トリガーの作成

2.1 トリガー構文の作成

トリガーを作成するための構文は次のとおりです。

CREATE TRIGGER トリガー名 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON テーブル名 FOR EACH ROW
トリガーによって実行されるステートメント ブロック。

例:

①テーブル名:トリガーが監視する対象を示します。

②BEFORE|AFTER: トリガー時間を示します。 BEFORE はイベントの前にトリガーすることを意味し、AFTER はイベントの後にトリガーすることを意味します。

③INSERT|UPDATE|DELETE: トリガーされたイベントを示します。

INSERT はレコードを挿入することを意味します。

UPDATE はレコードを更新することを意味します。

DELETE はレコードを削除することを意味します。

④ トリガーによって実行されるステートメントブロック: 単一の SQL ステートメント、または BEGIN...END 構造で構成された複合ステートメントブロックになります。

2.2 コード例

例:

①データテーブルを作成する:

テーブルtest_triggerを作成します(
id INT 主キー AUTO_INCREMENT、
t_note VARCHAR(30)
);

テーブルtest_trigger_logを作成します(
id INT 主キー AUTO_INCREMENT、
t_log VARCHAR(30)
);

②トリガーの作成:before_insertというトリガーを作成し、test_triggerデータテーブルにデータを挿入する前に、before_insertログ情報をtest_trigger_logデータテーブルに挿入します。

区切り文字 //
トリガー before_insert を作成する
test_trigger に挿入する前に
各行ごとに
始める
	test_trigger_log (t_log) に挿入します。
	VALUES('before_insert');
終わり //
区切り文字 ;

③test_triggerデータテーブルにデータを挿入する

test_trigger (t_note) に INSERT INTO VALUES ('test BEFORE INSERT trigger');

④test_trigger_logデータテーブルでデータを表示する

mysql> test_trigger_log から * を選択;
+----+---------------+
| id | t_log |
+----+---------------+
| 1 | 挿入前 |
+----+---------------+
セット内の 1 行 (0.00 秒)

3. トリガーの表示と削除

3.1 トリガーの表示

トリガーを表示するということは、データベースに既に存在するトリガーの定義、ステータス、および構文情報を表示することを意味します。

方法1: 現在のデータベース内のすべてのトリガーの定義を表示する

トリガーを表示\G

方法2: 現在のデータベースのトリガーの定義を表示する

SHOW CREATE TRIGGER トリガー名

方法3: システムライブラリinformation_schemaのTRIGGERSテーブルから「salary_check_trigger」トリガーの情報を照会する

information_schema.TRIGGERS から * を選択します。

3.2 トリガーの削除

トリガーもデータベース オブジェクトです。トリガーを削除するには、DROP ステートメントを使用します。構文は次のとおりです。

DROP TRIGGER IF EXISTS トリガー名;

4. トリガーの利点と欠点

4.1 利点

①トリガーによりデータの整合性を確保できます。

発注書ヘッダー テーブル (demo.importhead) を使用して、発注書番号、仕入先番号、倉庫番号、合計購入数量、合計購入金額、受諾日などの発注書の全体情報を保存するとします。

ここに画像の説明を挿入

購入注文詳細テーブル (demo.importdetails) を使用して、購入注文番号、製品番号、購入数量、購入価格、購入金額など、購入した商品の詳細を保存します。

ここに画像の説明を挿入

発注書の詳細データを入力、削除、または変更するたびに、発注書の詳細テーブル内のデータが変更されます。このとき、発注書ヘッダー テーブルの合計数量と合計金額を再計算する必要があります。そうしないと、発注書ヘッダー テーブルの合計数量と合計金額が発注書詳細テーブルの合計数量と等しくなくなります。

計算と金額が加算され、データの不一致が発生します。

この問題を解決するには、トリガーを使用して、発注書の詳細テーブルにデータが挿入、変更、または削除されるたびに、次の 2 つのステップを自動的にトリガーします。

1) 発注書詳細テーブルの合計数量と合計金額を再計算します。

2) 最初のステップで計算された値を使用して、発注書ヘッダーテーブルの合計数量と合計金額を更新します。

こうすることで、発注書ヘッダーテーブルの合計数量と合計金額の値は、発注書詳細テーブルで計算された合計数量と合計金額の値と常に同じになり、データの一貫性が保たれ、矛盾がなくなります。

②トリガーは操作ログを記録するのに役立ちます。

トリガーを使用すると、何がいつ発生したかを正確に記録できます。たとえば、メンバーの入金額を変更するためのトリガーを記録するのが良い例です。これは、操作が実行されたときの特定のシナリオを復元し、問題の原因をより正確に特定するのに非常に役立ちます。

③トリガーは、データを操作する前の正当性を確認するためにも使用できます。

たとえば、スーパーマーケットが商品を購入する場合、倉庫管理者は購入価格を入力する必要があります。しかし、人手による操作ではミスが起きやすいものです。例えば、数量を入力する際に​​バーコードをスキャンしてしまい、金額を入力する際に​​行を間違えて販売価格よりはるかに高い金額を入力してしまい、帳簿上大きな損失を招いてしまうのです。これらはトリガーを通じて実行できます。

または、更新操作の前に、対応するデータをチェックし、エラーを適時に通知して、誤ったデータがシステムに入力されるのを防ぎます。

4.2 デメリット

①トリガーの最大の問題は、読みにくさです。

トリガーはデータベースに保存され、イベント駆動型であるため、トリガーはアプリケーション層によって制御されない可能性があります。これはシステムメンテナンスにとって非常に困難です。たとえば、メンバーの入金操作を変更するトリガーを作成します。トリガー内の操作に問題がある場合、メンバーに格納された値の更新は失敗します。私は

次のコードはこれを示しています。

mysql> demo.membermaster を更新し、memberdeposit=20 に設定し、memberid = 2 にします。
エラー 1054 (42S22): 「フィールド リスト」に不明な列「aa」があります

結果には、システムがエラーをプロンプトし、フィールド「aa」が存在しないことが示されています。これは、トリガーのデータ挿入操作に余分なフィールドがあり、システムがエラーを表示するためです。しかし、このトリガーを理解していないと、更新文自体に問題があるのか​​、会員情報テーブルの構造に問題があるのか​​と思ってしまうかもしれません。たぶんあなたは

会員情報テーブルに「aa」というフィールドを追加してこの問題を解決しようとしましたが、無駄な努力でした。

②関連データの変更によりトリガーエラーが発生する場合があります。

特に、データ テーブル構造の変更によりトリガー エラーが発生し、データ操作の正常な動作に影響する可能性があります。これらは、トリガー自体の隠された性質により、アプリケーション内のエラーの原因をトラブルシューティングする効率に影響します。

4.3 注記

子テーブルに外部キー制約が定義されており、外部キーに ON UPDATE/DELETE CASCADE/SET NULL 句が指定されている場合、親テーブルの参照キー値を変更したり、親テーブルの参照レコード行を削除したりすると、子テーブルでも変更および削除操作が行われることに注意してください。

ステートメントによって定義されたトリガーはアクティブ化されません。

MySQL トリガーの使い方とメリット・デメリットについての記事はこれで終わりです。MySQL トリガーに関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL イベントとトリガーのトピックの絞り込み
  • 初心者から熟練者まで使えるMySQLデータベーストリガー
  • MySQL ストアド プロシージャ、トリガー、イベント スケジューラの入門ガイド
  • MySQLトリガートリガー例の詳細な説明
  • バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明
  • MySQLトリガーの使用
  • MySQLトリガーについて深く理解するための記事
  • MySQLトリガーの使用
  • MySQLトリガーの使い方を簡単に説明すると

<<:  HTML の div と span の比較_PowerNode Java Academy

>>:  JavaScript による Web ページ カルーセルの超詳細な実装

推薦する

JavaScriptのvar let constの違いは何ですか?

目次1. 繰り返し宣言1.1 変数1.2 しましょう1.3 定数2. 可変プロモーション2.1 変数...

Vueカスケードドロップダウンボックスの設計と実装

目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

目次実際のプロジェクトで遭遇する要件実装が間違っているところもある私は個人的に、実装するより良い方法...

Windows ホストと Docker コンテナに共有フォルダを設定してマウントする手順

Docker コンテナ内のプログラムは、ホスト ディレクトリ内のデータにアクセスして呼び出す必要があ...

H5ウェイクアップアプリの実装方法と注意点のまとめ

目次序文APPメソッドにジャンプURLスキームメタタグユニバーサルリンクさまざまな使い方URLスキー...

HTML の rel 属性の分析

.y { background: url(//img.jbzj.com/images/o_y.pn...

フレックスレイアウトは、上下固定、中間スライドのレイアウトモードを実現します。

この記事では、主に、上下固定と中スライドレイアウトを実現するためのフレックスレイアウトのレイアウト方...

MYSQL 演算子の概要

目次1. 算術演算子2. 比較演算子3. 論理演算子4. ビット演算子5. 演算子の優先順位1. 算...

コピー&ペーストはパッケージングの敵です

OO、デザイン パターン、および多くのオブジェクト指向の原則について話す前に、まず 1 つのことを習...

Angularルーティングサブルートの詳細な説明

目次1. サブルート構文2. 例1. 2つの新しいコンポーネントを作成し、その内容を変更する2. ル...

Chromeブラウザの自動パスワード保存プロンプト機能を無効にする方法

注: Web 開発では、フォームに autocomplete="off" を追加...

Node.js コンソールで強調表示されたコードを印刷する方法

序文コードを実行してエラーが発生すると、エラーが出力されます。エラーにはスタック情報が含まれており、...

優れたグラフィックデザイナーが習得すべき7つのスキル

1》ウェブデザインが得意であること2》Webページのデザイン方法を知る3》計画する4. SEOを理解...

IE 8/Chrome/Firefox と互換性のあるコメント返信ポップアップマスク効果実装アイデア

平日はニュースに注目して、テンセントをよく閲覧しています。しかし、コメントへの返信はほとんど見られま...