序文実際の開発では、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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: HTML の div と span の比較_PowerNode Java Academy
>>: JavaScript による Web ページ カルーセルの超詳細な実装
目次1. MySQLのコンパイルとインストール: 2. 最初のマルチインスタンス3307を準備する3...
現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...
Linux centos7 環境に MySQL をインストールする手順の詳細な紹介MySQLをインス...
まず、transform-origin 属性を使用する必要があります。transform 属性は必ず...
効果画像:実装コード: <テンプレート> <div id="map&qu...
具体的な方法:まずコマンドプロンプトを開きます。次に、[ mysql -u root -p ] コマ...
サーバーの構築には node.js を選択しました。まだインストールしていない方は、私の他の nod...
<tbody> タグは、テーブル本体のスタイルを定義するために使用されます。基本構文 &...
序文最近CocosCreatorを学びたいと思ったので、エディターをダウンロードして起動しました。誰...
1. オンラインテキストジェネレーターBlindTextGenerator: デザイナーにとって、こ...
2つのケース: 1. 索引あり 2. 索引なし前提条件:方法: コマンドラインを使用してシミュレート...
序文最近、同社の業務の一部がコンピュータルームに移転し、ホストリソースの監視と管理をより便利に行うた...
JavaScript では、警告ボックス、確認ボックス、プロンプト ボックスの 3 種類のメッセージ...
広告業は人間であることに似ていると言う人がいます。これは本当です。優れた広告には、優れた人間と同じよ...
UI デザインにおける多くの概念は言葉で言えば似ているように見えるかもしれませんが、実際には大きく異...