ホームページ  >  記事  >  データベース  >  MySQLトリガーの使用法

MySQLトリガーの使用法

黄舟
黄舟オリジナル
2016-12-12 11:53:221063ブラウズ

MySQL にはトリガーのサポートが含まれています。トリガーは、テーブル操作に関連するデータベース オブジェクトです。トリガーが配置されているテーブルで指定されたイベントが発生すると、オブジェクトが呼び出されます。つまり、テーブルの操作イベントがテーブルでのトリガーの実行をトリガーします。

トリガーを作成する
MySQL では、トリガーを作成するための構文は次のとおりです:

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

その中に:

trigger_name: ユーザーが指定したトリガー名を識別します。
trigger_time: トリガー時間を識別します。前または AFTER;
trigger_event: トリガー イベントを識別します。値は INSERT、UPDATE、または DELETE;
tbl_name: トリガーを作成するテーブル名、つまりトリガーが作成されるテーブルを識別します。
trigger_stmt: トリガー プログラム本体 (SQL ステートメント、または使用可能) BEGIN と END には複数のステートメントが含まれます。

6 種類のトリガー、つまり BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER を作成できることがわかります。 削除後に更新してください。

もう 1 つの制限は、テーブル上に同じタイプの 2 つのトリガーを同時に作成できないことです。そのため、テーブル上に作成できるトリガーは最大 6 つです。

trigger_eventの詳細説明
INSERT、UPDATE、DELETEを除くMySQL 基本的な操作の定義に加えて、LOAD DATA ステートメントと REPLACE ステートメントも定義されており、これらにより上記の 6 種類のトリガーをトリガーすることもできます。

LOAD DATA ステートメントは、ファイルをデータテーブルにロードするために使用されます。これは、一連の INSERT 操作と同等です。

REPLACE ステートメントは一般的に INSERT ステートメントと非常によく似ていますが、テーブルに主キーまたは一意のインデックスがある場合、挿入されたデータが元のデータと異なる場合が異なります。 主キーまたは一意のインデックスが一致している場合、最初に元のデータが削除され、その後新しいデータが追加されます。つまり、REPLACE ステートメントは 1 つと同等である場合があります。

INSERT ステートメントは、DELETE ステートメントに INSERT ステートメントを加えたものと同等になる場合があります。

INSERT タイプのトリガー: トリガーは行が挿入されるときにアクティブ化され、INSERT、LOAD DATA、および REPLACE ステートメントによってトリガーされる場合があります。 タイプ・トリガー: トリガーは、特定の行が変更されたときにアクティブ化され、UPDATE ステートメントによってトリガーされる可能性があります。
DELETE タイプ・トリガー: トリガーは、特定の行が削除されたときにアクティブ化されます。 DELETE および REPLACE ステートメントがトリガーされます。

BEGIN … END 詳細説明

MySQL では、BEGIN … END ステートメントの構文は次のとおりです:

BEGIN

[statement_list]
END
そのうち、statement_list 1 つ以上のステートメントのリストを表します。リスト内の各ステートメントはセミコロン (;) で終了する必要があります。
MySQL では、セミコロンはステートメントの終わりの識別子です。セミコロンに遭遇すると、ステートメントが終了し、MySQL が実行を開始できることを意味します。したがって、インタプリタはstatement_listに遭遇します。 実行は のセミコロンの後に開始され、BEGIN に一致する END が見つからないため、エラーが報告されます。

このとき DELIMITER コマンドが使用されます (DELIMITER は区切り文字、つまり区切り文字です)。これはコマンドであり、文の終わりの識別子は必要ありません。 構文は次のとおりです。 new_delimiter

new_delimiter 1 つ以上の長さの記号を設定できます。デフォルトはセミコロン (;) で、$:
DELIMITER などの他の記号に変更できます。 $
これ以降のステートメントはセミコロンで終了し、インタープリターは $ が出現した場合にのみ、ステートメントが終了したとみなされます。使用後は、忘れずに変更して戻す必要があることに注意してください。

トリガー作成の完全な例

システムに 2 つのテーブルがあるとします。

クラス テーブル class(クラス番号 classID、クラス内の生徒数 stuCount)
Student テーブル Student(学生番号 stuID, クラス番号 classID)
学生が追加されたときにクラス テーブルの学生数を自動的に更新するトリガーを作成するには、コードは次のとおりです。

DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;

変数の詳細な説明

MySQL で DECLARE を使用して、ローカル変数を定義します。この変数は BEGIN...END でのみ使用できます。 これは複合ステートメントで使用され、複合ステートメントの先頭、つまり他のステートメントの前に定義する必要があります。 構文は次のとおりです:


DECLARE var_name[,...] type [DEFAULT value]

ここで:

var_name は SQL と同じ変数名です。 ステートメントは同じであり、変数名は大文字と小文字が区別されません。型は MySQL でサポートされる任意のデータ型です。同じ型の複数の変数をカンマで区切って同時に定義できます。必要に応じて、使用できます DEFAULT 句は、式として指定できるデフォルト値を提供します。

変数の割り当てには SET ステートメントを使用します。構文は次のとおりです:

SET var_name = expr [,var_name = expr] ...

NEW と OLD の詳細な説明

上記の例では NEW キーワードが使用されており、 MS SQL Server の INSERTED と DELETED は、MySQL で定義されるものと似ています。 古い、

を表すために使用されます

トリガーが配置されているテーブル内の、トリガーをトリガーしたデータの行。
具体的には:
INSERT タイプのトリガーでは、NEW (BEFORE) 挿入される新しいデータ、または (AFTER) 挿入された新しいデータを表すために使用されます。 UPDATE タイプのトリガーでは、OLD は変更される、または変更された元のデータを表すために使用されます。 変更される、または変更された新しいデータを表すために使用されます。
DELETE タイプのトリガーでは、削除される、または削除された元のデータを表すために使用されます。 NEW.columnName (columnNameは対応するデータテーブルの列名です)
さらに、OLDは読み取り専用ですが、NEWはトリガーでSETを使用できます トリガーが再びトリガーされて循環呼び出しが発生しないように、値を割り当てます (たとえば、学生を挿入する前に、学生番号の前に「2013」を追加します)。

トリガーの表示


は、データベースの表示 (show Databases;) およびテーブルの表示 (show tables;) と同じです。 トリガーの表示の構文は次のとおりです:

SHOW TRIGGERS [FROM schema_name];

ここで、schema_name は次のとおりです。 MySQL のスキーマの名前 スキーマとデータベースは同じです。つまり、データベース名を指定できるため、最初に「USE database_name;」を行う必要はありません。


トリガーの削除

データベースやテーブルの削除と同様に、トリガーを削除する構文は次のとおりです:


DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

トリガーの実行順序

作成したデータベースこれは通常 InnoDB データベースであり、その上に作成されたテーブルはトランザクション テーブル、つまりトランザクション セーフです。このとき、SQL ステートメントまたはトリガーの実行に失敗すると、MySQL トランザクションは以下を含めてロールバックされます:


① BEFORE トリガーの実行に失敗した場合、SQL は正しく実行できません。

②SQLの実行が失敗した場合、AFTERトリガーは起動しません。

③アフター タイプのトリガーの実行に失敗すると、SQL はロールバックされます。

皆さん、mysql トリガーの使用についてはある程度理解できましたか? ご質問があれば、メッセージを残してください。一緒に進歩していきます。

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