ホームページ  >  記事  >  データベース  >  MySQL がトリガーの使用方法を簡単に説明します

MySQL がトリガーの使用方法を簡単に説明します

WBOY
WBOY転載
2022-09-01 14:41:312043ブラウズ

推奨学習: mysql ビデオ チュートリアル

実際の開発では、このような状況によく遭遇します。2 つまたは複数の相互関連がある製品情報と在庫情報などのテーブルは、それぞれ 2 つの異なるデータ テーブルに格納されます。新しい製品レコードを追加するときは、データの整合性を確保するために、新しい製品レコードも在庫テーブルに追加する必要があります。記録。このようにして、これら 2 つの関連する操作ステップをプログラムに書き込み、トランザクションでラップして、これら 2 つの操作がアトミック操作になるようにする必要があります (すべてが実行されるか、まったく実行されないかのどちらかです)。

特殊な状況が発生した場合は、データを手動で保守する必要がある場合があるため、1 つの手順を忘れてデータが失われる可能性があります。このとき、トリガーを使用できます。製品情報データの挿入によって自動的に在庫データの挿入がトリガーされるように、トリガーを作成できます。これにより、在庫データの追加忘れによるデータの欠落を心配する必要がなくなります。

トリガーの概要

MySQL は、バージョン 5.0.2 以降のトリガーをサポートします。 MySQL トリガーは、ストアド プロシージャと同様、MySQL サーバーに埋め込まれたプログラムです。トリガーは、INSERT、UPDATE、DELETE イベントなどのイベントによってトリガーされる操作です。

いわゆるイベントとは、ユーザーのアクション、または特定の動作のトリガーを指します。トリガー プログラムが定義されている場合、データベースがこれらのステートメントを実行すると、イベントが発生したことと同等になり、トリガーが自動的にトリガーされ、対応する操作が実行されます。データ テーブル内のデータに対して挿入、更新、および削除操作を実行し、一部のデータベース ロジックを自動的に実行する必要がある場合、トリガーを使用してこれを実現できます。

トリガーの作成

トリガーの作成構文

CREATE TRIGGER 触发器名称 
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 
FOR EACH ROW 
触发器执行的语句块;

説明:

テーブル名: トリガーによって監視されるオブジェクトを示します。

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

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

INSERT はレコードの挿入時にトリガーされることを意味します;

UPDATE はレコードの更新時にトリガーされることを意味します;

DELETE はレコードの削除時にトリガーされることを意味します。

コード例 1

2 つのテーブルを作成します

CREATE TABLE test_trigge r (
id INT PRIMARY KEY AUTO_INCREMENT ,
t_note VARCHAR ( 30 )
) ;
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT ,
t_log VARCHAR ( 30 )
) ;

トリガーを作成します

DELIMITER / /
CREATE TRIGGER befo_re_insert
BEFORE INSERT ON test_trigger 
FOR EACH ROW
BEGIN
 INSERT INTO test_trigger_log ( t_log )
 VALUES ( ' befo re_inse rt ' ) ;
END / /
DELIMITER ;

test_trigger データ テーブルにデータを挿入します

INSERT INTO test_trigger (t_note) VALUES ('测试 BEFORE INSERT 触发器');

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

SELECT * FROM test_trigger_log

##コード例 2

トリガーを作成する

DELIMITER / /
CREATE TRIGGER after_insert
AFTER INSERT ON test_trigger
FOR EACH ROW
BEGIN
 INSERT INTO test_trigger_log ( t_log )
 VALUES ( ' after_insert ' ) ;
END / /
DELIMITER ;

test_trigger データ テーブルにデータを挿入します。

INSERT INTO test_trigger (t_note) VALUES ('测试 AFTER INSERT 触发器');

test_trigger_log データ テーブルのデータを表示します

SELECT * FROM test_trigger_log

コード例 3

以下に基づいて、トリガー「salary_check_trigger」を定義します。従業員テーブル「従業員」の INSERT イベントで、INSERT の前に、追加する新しい従業員の給与がリーダーの給与より大きいかどうかを確認します。リーダーの給与より大きい場合、sqlstate_value が 'HY000' になるエラーが発生します。と報告され、追加が失敗します。

DELIMITER //
CREATE TRIGGER salary_check_trigger
BEFORE INSERT ON employees FOR EACH ROW
BEGIN
DECLARE mgrsalary DOUBLE;
SELECT salary INTO mgrsalary FROM employees WHERE employee_id = NEW.manager_id;
IF NEW.salary > mgrsalary THEN
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误';
END IF;
END //
DELIMITER ;

上記のトリガー宣言プロセスの NEW キーワードは、INSERT ステートメントの新しいレコードを表します。

削除トリガーの表示

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

SHOW TRIGGERS

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

SHOW CREATE TRIGGER 触发器名

方法 3: システム ライブラリ information_schema の TRIGGERS テーブルから「salary_check_trigger」トリガー情報をクエリします。

SELECT * FROM information_schema.TRIGGERS;

トリガーの削除

DROP TRIGGER IF EXISTS 触发器名称

トリガーの利点

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

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

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

数量、購入価格、および購入金額が、発注書の詳細にある合計数量および合計金額と等しくありません。これはデータの不一致です。

この問題を解決するには、トリガーを使用して、発注書詳細テーブル

でデータの挿入、変更、削除が行われるたびに、2 段階の操作が自動的に実行されるように規定できます。トリガー:

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

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

このようにして、発注書ヘッダー テーブルの合計数量と合計金額は、発注書詳細テーブルで計算された合計数量と

と常に同じになります。データは一貫しています。そして互いに矛盾しません。

2. トリガーは操作ログの記録に役立ちます。

トリガーを使用すると、いつ何が起こったかを具体的に記録できます。たとえば、メンバーの保管金額を変更するためのトリガーを記録することは、非常に良い例です。これは、操作の実行時に特定のシナリオを復元し、問題の原因をより適切に特定するのに非常に役立ちます。

3. トリガーは、データを操作する前にデータの有効性をチェックするためにも使用できます。

たとえば、スーパーマーケットが商品を購入する場合、倉庫管理者は購入価格を入力する必要があります。しかし、数量を入力する際に​​バーコードをスキャンし、金額を入力する際に​​シリアル番号を読み取ってしまい、入力した価格が販売価格を大幅に超えてしまったなど、人間の操作はミスが起こりやすいものです。巨額の損失...

これらはすべて、トリガーを通じて実際の挿入または更新操作の前に対応するデータをチェックし、適切なタイミングでエラーを促し、エラーを防ぐために使用できます

間違ったデータがシステムに入力されました。

トリガーの欠点

1. トリガーの最大の問題の 1 つは、可読性が低いことです。

トリガーはデータベースに保存され、イベントによって駆動されるため、トリガーはアプリケーション層によって制御されない可能性があります。これはシステムのメンテナンスにとって非常に困難です。

たとえば、メンバーのリチャージ操作を変更するトリガーを作成します。トリガーの操作に問題がある場合、メンバーの保管金額の更新は失敗します。次のコードを使用して実証します。

結果は、システムがエラーを表示し、フィールド "aa" が存在しないことを示しています。

これは、トリガーでのデータ挿入操作にもう 1 つのフィールドがあり、システムによってエラーが表示されるためです。ただし、このトリガーを理解していないと、update 文そのものに問題があるのではないか、あるいはメンバー情報テーブルの構造に問題があるのではないかと考えられるかもしれません。この問題を解決するために、メンバー情報テーブルに「aa」というフィールドを追加することも考えられますが、結果は無駄になります。

2. 関連データの変更により、トリガー エラーが発生する可能性があります。

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

注意事項

子テーブルに外部キー制約が定義されており、外部キーに ON UPDATE/DELETE CASCADE/SET NULL 句が指定されている場合、親テーブルの変更が参照されることに注意してください。親テーブルが参照するキー値またはレコード行が削除されると、子テーブルの変更および削除操作も発生します。このとき、子テーブルの UPDATE 文および DELETE 文に基づいて定義されたトリガーは実行されません。活性化される。

例: 子テーブルの従業員テーブル (t_employee) に基づく DELETE ステートメントはトリガー t1 を定義し、子テーブルの部門番号 (did) フィールドは親テーブルの部門を参照する外部キー制約を定義します。テーブル(t_Department)。主キーカラムは部門番号(did)、外部キーにはONDELETE SET NULL句が追加されています。このとき親テーブルの部門テーブル(t_Department)を削除すると、子テーブルは従業員テーブル (t_employee)

推奨される学習:

mysql ビデオ チュートリアル

以上がMySQL がトリガーの使用方法を簡単に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。