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 ページ カルーセルの超詳細な実装

推薦する

IE6 および IE7 で DIV コンテナの固定高さを使用するためのヒント

IE6 と IE7 では CSS の解釈に多くの違いがあります。今日はそのうちの 1 つである高さに...

Apache POIの基本的な使い方の詳しい説明

目次基本的な紹介入門テスト (Excel ファイルからのデータの読み取り)ステップ1: Maven座...

Vue の新しいパートナー TypeScript クイックスタート実践記録

目次1. 公式の足場を使って構築する2. プロジェクトディレクトリ分析3. TypeScript の...

異なるドメイン名への PC または携帯電話のアクセスを区別するように Nginx を構成する方法

新しい公式サイトはオンラインですが、携帯電話で新しい公式サイトにアクセスすると、エクスペリエンスが非...

Debian ベースの Linux システム ソフトウェア インストール コマンドの詳細な説明 (推奨)

Debian の紹介Debian は、広い意味では、フリーなオペレーティング システムの作成に専念...

我々は自らの力でIE6を絶滅に追い込んでいる

実際、IE6 が本当にいつ消滅するのか私たちは毎日疑問に思っていますが、2001 年のリリース以来、...

MySQLインデックスの作成について知っておくべきこと

目次序文: 1. インデックスメソッドを作成する2. インデックスを作成するために必要な権限序文: ...

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

XHTML でのハイパーリンク タグの使用に関するチュートリアル

ハイパーリンク。「リンク」とも呼ばれます。ハイパーリンクは、私たちが閲覧する Web ページのいたる...

docker-machineの使い方の詳しい説明

Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...

JSはショッピングカート効果の単純な加算と減算を実装します

この記事の例では、ショッピングカートの簡単な追加と削除を実現するためのJSの具体的なコードを参考まで...

Mysql5.7でのスケジュールバックアップの実装

1. MySQL インストール パス D:\xxx\MYSQL\MySQL Workbench CE...

よく使われるシングルページアプリケーションウェブサイト共有

CSS3お願いしますこのウェブサイトを自分で見て、パラメータを変更し、CSS3効果をオン/オフにする...

MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)

インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...

ウェブページの再設計の7つの主要要素 ウェブページの再設計の7つの主要要素を共有する

Shopify Plus は、私たちが設立した e コマース プラットフォームのエンタープライズ バ...