推奨学習: 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 はレコードの削除時にトリガーされることを意味します。
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 文に基づいて定義されたトリガーは実行されません。活性化される。
推奨される学習:
mysql ビデオ チュートリアル以上がMySQL がトリガーの使用方法を簡単に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。