MySQLトリガーの使用

MySQLトリガーの使用

トリガーにより、ステートメントの実行前または実行後に他の SQL コードを実行できます。トリガーは、トリガー ステートメントによって変更されたデータを読み取ることができますが、戻り値はありません。したがって、トリガーを使用すると、アプリケーション内に対応するコードを記述せずに、ビジネス ロジックの制約を適用できます。

上記の説明から、トリガーを使用するとアプリケーションのロジックが簡素化され、パフォーマンスが向上することがわかります。これは、トリガーを使用すると、アプリケーションとサーバー間のやり取りの回数が減るためです。また、トリガーは正規化と統計を自動的に更新するのに役立ちます。たとえば、トリガーを使用して、合計取引金額、注文数、平均注文値を自動的にカウントできます。 ただし、MySQL トリガーの適用シナリオも非常に限られています。他のデータベース製品のトリガーを使用したことがある場合は、MySQL でも同じ機能を実現できるとは想定しないでください。例:

  • 各データ テーブルには、1 つのイベントに対して 1 つのトリガーのみを設定できます。つまり、AFTER INSERT などのイベントでは、同時に複数のトリガーを設定することはできません。
  • MySQL は行レベルのトリガーのみをサポートしています。つまり、SQL ステートメント全体ではなく、FOR EACH ROW モードでのみトリガーを使用できるため、大量のデータの操作には非効率的です。 MySQL トリガーは次の形式でのみ記述できます。
CREATE TRIGGER トリガー名 BEFORE | AFTER トリガーイベント ON テーブル名 FOR EACH ROW
始める
    ステートメントリストを実行します。
終わり

実行ステートメント リストは、単一または複数のステートメントをサポートします。次に、複数のステートメントの例を示します。

区切り文字 $$
各行に対して t_users に INSERT した後に、トリガー user_create_log を作成します。
始める
log_info VARCHAR(40) 文字セット utf8 を宣言します。
DECLARE description VARCHAR(20) character set utf8;#後に中国語の文字エンコードが文字化けしていることが判明したので、ここで文字セットを設定しました SET description = " が作成されます";
SET log_info = CONCAT(NEW.user_name, description); #CONCAT 関数は文字列を連結できます INSERT INTO logs(log) values(log_info);
終了 $$

区切り文字 ;
  • トリガーにより、サーバーによって実行される実際の作業が予測不可能になる可能性があり、単純なステートメントによってサーバーが多くの目に見えない作業を実行する可能性があります。たとえば、トリガーが従属テーブルを更新すると、影響を受ける行数が 2 倍になる可能性があります。
  • トリガーはデバッグが難しく、一度導入されるとパフォーマンスのボトルネックを分析するのが難しくなります。
  • トリガーにより、潜在的なロック待機やデッドロックが発生する可能性があります。トリガーが失敗すると、ソース クエリも失敗します。このタイプのプレイは、トリガーを認識していない場合は検出が困難になる可能性があります。

最も大きな制限は FOR EACH ROW の設計です。これにより、トリガーを使用して統計やキャッシュ テーブルを維持できなくなることがあります。これは、処理が遅くなる可能性があるためです。トリガーを使用する主な理由は、スケジュールされた同期更新と比較して、データの一貫性を一貫して維持できることです。 トリガーもアトミック性を保証することはできません。たとえば、MyISAM テーブルを更新するトリガーは、ソース SQL ステートメントでエラーが発生した場合はロールバックできません。さらに、トリガー自体に欠陥がある可能性もあります。 MyISAM データ テーブルに基づいて AFTER UPDATE を使用して別のテーブルを更新する場合。トリガーにエラーがあり、2 番目のテーブルでの操作が失敗した場合、最初のテーブルでの操作はロールバックされません。

ソース ステートメントを含む InnoDB トリガー関連の操作はすべて同じトランザクション内にあるため、アトミック性要件を満たしています。ただし、InnoDB トリガーを使用して別のテーブルとのデータの一貫性を検証する場合、注意しないと誤った結果が生じる可能性があります。たとえば、トリガーを使用して外部キーをシミュレートする必要がある場合は、BEFORE INSERT トリガーを使用して、対応するレコードが別のテーブルに存在するかどうかを確認できます。ただし、トリガーが別のテーブルからデータを読み取るときに SELECT FOR UPDATE を使用しないと、同時実行の問題により誤った結果が発生する可能性があります。 トリガーにはいくつか欠陥がありますが、使用できないわけではありません。逆に、トリガーは、特に制約、システム メンテナンス タスク、統計を最新の状態に保つ場合など、それ自体でも役立ちます。

トリガーを使用してデータ行の変更を記録することもできます。この方法では、オフラインでの手動データベース操作(誤ったデータの修復など)の記録も記録できます。ただし、他の自動インクリメント主キー テーブルにデータを挿入する場合は注意が必要です。2 つの同一のレプリカの自動インクリメント値が異なるため、複製されたステートメントで問題が発生する可能性があります。

結論:

トリガーは、統計データ、データ テーブルの変更ログなどの限られた状況でその利点を発揮できます。ただし、いくつかの欠点もあります。たとえば、大量のデータを更新すると、行ごとにトリガーされるため、効率が低下します。また、MyISAM エンジンはアトミック性を保証できません。したがって、トリガーがあるかどうかは、アプリケーション シナリオによって異なります。

以上がMySQLトリガーの使用に関する詳細な内容です。MySQLトリガーの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。

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

<<:  JavaScript の基本演算子

>>:  Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

推薦する

VMware に CentOS7 をインストールし (静的 IP アドレスを設定)、Docker コンテナ経由で mySql データベースをインストールする (非常に詳細なチュートリアル)

2 年生から、これらのインストールと設定の仕方を尋ねられました。簡単なチュートリアルを作成し、ここ...

CSS の優先順位に関する詳細な紹介

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

mysql5.7.21 の異常起動を修正する方法

同僚から、停電のため MySQL インスタンスを起動できないという報告がありました。 innodb_...

MySQL データベース グループ クエリの group by ステートメントの詳細な説明

1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...

HTML ページに SVG を挿入する複数の方法

SVG (Scalable Vector Graphics)は、XML 構文に基づいた画像形式です。...

コンテンツの位置をランダムにドラッグするHTMLを実装する2つの方法

テスト: Chrome v80.0.3987.122 は正常です方法は2つあります。通常のラベルの位...

Dockerコンテナが停止できない問題の解決方法

解決策は次のとおりです。 1. コンテナを強制削除する docker rm -f ジェンキンス2. ...

Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

PHP7が出たので、最新バージョンのファンとしては、早速アップグレードして体験してみました。しかし...

CSS ウェイト値(カスケード)の例の詳細な説明

•CSSには多くのセレクターがあります。複数のセレクターを同じ要素に適用するとどうなるでしょうか? ...

W3C 検証に合格するにはどうすればいいですか?

W3C では、さまざまなタグの規定を設定するだけでなく、Web ページの作成者が実際に W3C 規...

初心者のためのウェブサイト構築入門 - ウェブサイト構築に必要な条件とツール

今日は、初心者の次のような質問に答えます。学ぶ勇気さえあれば、自分のウェブサイトを構築するのは簡単で...

MySQL マスタースレーブレプリケーションの実装手順

目次mysql マスタースレーブレプリケーションMySQL マスタースレーブレプリケーション方式My...

Linux インストール Apache サーバー構成プロセス

袋を用意するインストールApacheがすでにインストールされているかどうかを確認するrpm -qa ...

Python Django アプリケーションを Docker 化する方法

Docker は、開発者やシステム管理者がアプリケーションを軽量コンテナとして構築およびパッケージ化...

Layuiテーブル行のデータを動的に編集する

目次序文スタイル機能説明初期化コードイベントリスナーの追加リスナーツールバーモニターテーブル行ツール...