20.3 トリガーの使用

トリガーとは、テーブルに関連付けられ、そのテーブルに対して特定のイベントが発生するとアクティブ化される名前付きデータベースオブジェクトのことです。トリガーを使用する場合には、テーブルに挿入する値のチェックを実行したり、更新にかかわる値の計算を実行したりする場合があります。

トリガーは、関連付けられたテーブルでステートメントが行の挿入、更新、または削除を行なったときにアクティブ化するように定義されます。これらの行操作がトリガーイベントになります。たとえば、行は、INSERT または LOAD DATA ステートメントで挿入でき、挿入トリガーは挿入された行ごとにアクティブ化します。トリガーは、トリガーイベントの前または後のどちらかでアクティブ化するように設定できます。たとえば、テーブルに挿入される各行の前、または更新される各行のあとでトリガーをアクティブ化させることができます。

重要

MySQL のトリガーは、SQL ステートメントがテーブルに対して行なった変更の場合にのみアクティブ化します。ビューでの変更や、SQL ステートメントを MySQL Server に転送しない API がテーブルに対して行なった変更ではアクティブ化しません。これは次のことを意味します。

  • INFORMATION_SCHEMA または performance_schema テーブルは実際にはビューなので、トリガーは、これらのテーブルでの変更ではアクティブ化されません。

  • トリガーは、NDB API を使用して行われた更新によってアクティブ化されません。

次のセクションでは、トリガーを作成および削除するための構文について説明し、使用方法の例をいくつか挙げ、トリガーメタデータを取得する方法を示します。

追加のリソース


User Comments
  Posted by Gabe Holmes on June 20, 2009
A trigger can be used to do a real time pivot of an entity-attribute-value table. Suppose you have two tables, "eav" with columns entity, attribute, and value (entity+attribute are the primary key) and "pivot" with columns id,Author,Title,Publisher.
Here's the code:

create trigger ai_eav
after insert on eav
for each row
begin
set @id=new.entity;
set @attribute=new.attribute;
set @value=new.value;
update pivot
set
Author=(select if(@attribute='Author',@value,Author)),
Title=(select if(@attribute='Title',@value,Title)),
Publisher=(select if(@attribute='Publisher',@value,Publisher))
where
id=@id;
end
  Posted by Andre K. on March 23, 2014
Be aware of that MySQL does foreign key checks BEFORE invoking any trigger. So it is not possible to implement a BEFORE INSERT trigger that enters up a missing column value with a foreign key constraint.
  Posted by Russell Bohlmann on July 15, 2014
Regarding a BEFORE INSERT/UPDATE TRIGGER: I have found that value TYPE checks (ie. checks for integer vs. string values) are done BEFORE the trigger is invoked but FOREIGN KEY checks are done AFTER.
Sign Up Login You must be logged in to post a comment.