ホームページ >データベース >mysql チュートリアル >mysqlでのトリガー使用例を詳しく解説

mysqlでのトリガー使用例を詳しく解説

黄舟
黄舟オリジナル
2017-06-04 10:01:211337ブラウズ

この記事では、主に mysql トリガー の使用例に関する関連情報を紹介します。必要な方は、

MySQLトリガー構文の詳細な説明を参照してください:

トリガーは特別なものです。 ストアドプロシージャ特定のテーブルにデータを挿入 (inset)、delete (delete) または変更 (update) するときに実行をトリガーする データ自体よりも標準的な関数があり、より高度で複雑なデータ制御です。能力。トリガーはプログラムによって呼び出されるのではなく、イベントによってトリガーされます。データが変更されたときにビジネス ルールを自動的に適用します。多くの場合、データの整合性 制約 やビジネス ルールなどを強化するために使用されます。トリガーは他のテーブルにクエリを実行し、複製された SQL ステートメントを含めることができます。トリガーを使用して、reference整合性を強制することもできます。トリガーは、チェック制約で定義された制約よりも複雑な制約を強制できます。トリガーは、テーブルに関連する名前付きデータベース
オブジェクト

です。このオブジェクトは、特定のイベントが発生したときにアクティブ化されます。

トリガーは tbl_name という名前のテーブルに関連しています。 tbl_name は永続テーブルを参照する必要があります。トリガーを TEMPORARY テーブルやビューに関連付けることはできません。
trigger_time はトリガープログラムの動作時間です。

BEFORE

または AFTER で、トリガーをアクティブにするステートメントの前または後にトリガーが起動されるかどうかを示します。 trigger_event は、トリガプログラムを起動する文の種類を指定します。 trigger_event は次のいずれかの値です: (1).INSERT: トリガーは、たとえば INSERT、LOAD DATA、REPLACE ステートメントを通じて新しい行がテーブルに挿入されるときにアクティブ化されます。 (2).UPDATE: たとえば UPDATE ステートメントを通じて、特定の行が変更されたときにトリガーをアクティブにします。 (3).DELETE: トリガーは、たとえば DELETE ステートメントや REPLACE ステートメントによってテーブルから行が削除されるときにアクティブになります。
trigger_event は、テーブル操作を通じてトリガー プログラムをアクティブにする SQL ステートメントとあまり似ていないことに注意することが重要です。たとえば、INSERT の BEFORE トリガーは、INSERT ステートメントだけでなく、LOAD DATA ステートメントによってもアクティブ化できます。混乱を引き起こす可能性のある例の 1 つは、 INSERT INTO .. ON DUPLICATE UPDATE ... 構文: BEFORE INSERT トリガーが行ごとにアクティブ化され、続いて AFTER INSERT トリガー、または BEFORE UPDATE と AFTER UPDATE トリガーが続きます。行。
特定のテーブルに対して、同じトリガー アクション時間とイベントを持つ 2 つのトリガーを存在させることはできません。たとえば、特定のテーブルについては、2 つの BEFORE UPDATE トリガーを使用することはできません。ただし、1 つの BEFORE UPDATE トリガーと 1 つの BEFORE INSERT トリガー、または 1 つの BEFOREUPDATE トリガーと 1 つの AFTER UPDATE トリガーが存在する可能性があります。 trigger_stmt は、トリガーがアクティブになったときに実行されるステートメントです。複数のステートメントを実行する予定がある場合は、BEGIN...
END 複合ステートメント構造を使用できます。このように、ストアド サブルーチンで許可されているのと同じステートメントを使用できます

(2) DROP TRIGGER 構文




DROP TRIGGER[schema_name.]trigger_name はトリガー プログラムを破棄します。スキーマ名 (schema_name) はオプションです。スキーマを省略した場合、トリガーは現在のスキーマから破棄されます。

注意 : MySQL 5.0.10 より前の MySQL バージョンから 5.0.10 以降 (すべての MySQL 5.1 バージョンを含む) にアップグレードする場合は、アップグレードする前にすべてのトリガーを破棄し、その後再作成する必要があります。そうしないと、DROP TRIGGER は実行されません。アップグレード後に動作します。 DROP TRIGGER ステートメントには SUPER 権限が必要です。

(3). トリガーの使用

このセクションでは、MySQL 5.1 でのトリガーの使用方法と、トリガーの使用に関する制限事項を紹介します。

トリガーは、テーブルで特定のイベントが発生したときにアクティブ化される、テーブルに関連する名前付きデータベース オブジェクトです。一部のトリガーの使用法は、テーブルに挿入された値を確認したり、更新に含まれる値の計算を実行したりするために使用できます。

トリガープログラムはテーブルに関連付けられており、テーブルに対して INSERT、DELETE、または UPDATE ステートメントが実行されると、トリガープログラムが起動されます。トリガーは、ステートメントの実行前または後にアクティブになるように設定できます。たとえば、各行がテーブルから削除される前、または各行が更新された後に、トリガーをアクティブ化できます。トリガーを作成または破棄するには、CREATE TRIGGER ステートメントまたは DROP TRIGGER ステートメントを使用します。トリガーは、クライアントにデータを返すストアド プロシージャを呼び出すことも、CALL ステートメント (ストアド プロシージャを許可する) を使用して動的 SQL を使用することもできません。データリターントリガーにパラメータを渡すため)。

マグノリー。
トリガーの影響を受ける行の列にアクセスするには、OLD キーワードと NEW キーワードを使用します (OLD と NEW では大文字と小文字が区別されません)。

INSERT トリガーでは NEW.col_name のみを使用でき、古い行は使用できません。 DELETE トリガーでは、OLD.col_name のみを使用でき、改行は使用できません。 UPDATE トリガーでは、OLD.col_name を使用して更新前の行の列を参照するか、NEW.col_name を使用して更新された行の列を参照できます。

OLD という名前の列は読み取り専用です。参照することはできますが、変更することはできません。 NEW という名前の列については、SELECT 権限がある場合に参照できます。 BEFORE トリガー プログラムでは、UPDATE 権限がある場合、「SET NEW.col_name = value」を使用して値を変更できます。これは、トリガーを使用して、新しい行に挿入される値を変更したり、行内の値を更新したりできることを意味します。 BEFORE トリガー プログラムでは、AUTO_INCREMENT 列の NEW 値は 0 ですが、これは新しいレコードが実際に挿入されるときに自動的に生成されるシーケンス番号ではありません。

BEGIN...END 構造体を使用すると、複数のステートメントを実行するトリガー プログラムを定義できます。 BEGIN ブロックでは、条件文や
ループ

など、保存されたサブルーチンで許可されている他の構文も使用できます。ただし、ストアド サブルーチンと同様に、複数のステートメントを実行するトリガー プログラムを定義する場合、mysql プログラムを使用してトリガー プログラムに入る場合は、トリガー プログラム内で文字「;」を使用できるようにステートメント区切り文字を再定義する必要があります。意味。以下の例では、これらの点を説明します。この例では、各行を更新するときに使用される新しい値をチェックし、値が 0 ~ 100 の範囲内になるように値を変更する UPDATE トリガーが定義されています。行の更新に使用される前に値をチェックする必要があるため、BEFORE トリガーである必要があります:

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
   -> FOR EACH ROW
   -> BEGIN
   -> IF NEW.amount < 0 THEN
   -> SET NEW.amount = 0;
   -> ELSEIF NEW.amount > 100 THEN
   -> SET NEW.amount = 100;
   -> END IF;
   -> END;//
mysql> delimiter ;
ストアド プロシージャを個別に定義し、単純な CALL ステートメントを使用してトリガー プログラムからストアド プロシージャを呼び出す方が簡単です。 。この方法は、複数のトリガー プログラム内から同じサブルーチンを呼び出す予定がある場合にも役立ちます。トリガー プログラムの実行中、MySQL は次のようにエラーを処理します: (1) BEFORE トリガー プログラムが失敗した場合、対応する行の操作は実行されません。

(2) AFTER トリガーは、BEFORE トリガー (存在する場合) と行操作が正常に実行された場合にのみ実行されます。

(3) BEFORE または AFTER トリガー プログラムの実行中にエラーが発生した場合、トリガー プログラムを呼び出すステートメント全体が失敗します。
(4) トランザクション テーブルの場合、トリガーが失敗した場合 (およびその結果としてステートメント全体が失敗した場合)、ステートメントによって実行されたすべての変更がロールバックされます。非トランザクション テーブルの場合、このタイプのロールバックは実行できないため、ステートメントが失敗した場合でも、失敗前に行われた変更は引き続き有効です。


例 1:

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。