ホームページ >データベース >mysql チュートリアル >mysqlトリガーの使用例の共有

mysqlトリガーの使用例の共有

小云云
小云云オリジナル
2018-01-17 10:06:441177ブラウズ

この記事では、mysql トリガーの使用例の詳細な説明に関する関連情報を主に紹介します。必要な方は参考にしていただければ幸いです。

MySQL トリガー構文の詳細な説明:

トリガーは、特定のテーブルにデータを挿入 (挿入)、削除 (delete)、または変更 (更新) するときに実行をトリガーする特別なストアド プロシージャであり、データよりも小さいです。 Standard 自体は、より高度で洗練されたデータ制御機能を備えています。トリガーはプログラムによって呼び出されるのではなく、イベントによってトリガーされます。データが変更されたときにビジネス ルールを自動的に適用します。多くの場合、データ整合性の制約とビジネス ルールを強化するために使用されます。トリガーは他のテーブルにクエリを実行し、複製された SQL ステートメントを含めることができます。トリガーを使用して参照整合性を強制することもできます。トリガーは、チェック制約で定義された制約よりも複雑な制約を強制できます。

(1).CREATE TRIGGER 構文

CREATE TRIGGERtrigger_nametrigger_timetrigger_event ON tbl_name FOR EACH ROWtrigger_stmt;
トリガーは、テーブルに関連する名前付きデータベース オブジェクトであり、テーブルで特定のイベントが発生したときにアクティブ化されます。
トリガーは 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 を使用することもできません (これにより、ストアド プロシージャはデータを返すことができます)。パラメータを介してトリガーに送信されます)。


トリガーでは、START TRANSACTION、
COMMIT、ROLLBACK など、トランザクションを明示的または暗黙的に開始または終了するステートメントを使用できません。

トリガーの影響を受ける行の列にアクセスするには、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 プロジェクトでの情報のバックアップ、リカバリ、クリアに使用されます

MySQL トリガーに関する質問

mysql トリガーの概要と作成方法トリガーを削除します

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

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