MySQL
トリガー
サーチ…
構文
- CREATE [DEFINER = {ユーザー| CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event各行のtbl_nameを指定します[trigger_order] trigger_body
- trigger_time:{BEFORE |後に}
- trigger_event:{INSERT |更新| DELETE}
- trigger_order:{FOLLOWS | PRECEDES} other_trigger_name
備考
既に他人のトリガーを使用している場合は、2つのポイントで注意を引く必要があります。
行ごとに
FOR EACH ROW
は構文の必須部分です
あなたは何のOracleのように(一回クエリによる) 文トリガーを作成することはできません。本当の欠けている機能よりもパフォーマンスに関連する問題です
トリガーの作成または置換
CREATE OR REPLACE
はMySQLでサポートされていません
MySQLはこの構文を許可していませんが、代わりに以下を使用します。
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
これはアトミックトランザクションではないことに注意してください。
-
CREATE
失敗した場合、古いトリガーを失います - 重い負荷では、
DROP
とCREATE
間で他の操作が発生する可能性がありますLOCK TABLES myTable WRITE;
使用してLOCK TABLES myTable WRITE;
最初にデータの不一致とUNLOCK TABLES;
を回避するUNLOCK TABLES;
テーブルを解放するCREATE
後
基本的なトリガー
テーブルの作成
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
トリガーの作成
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)
CREATE TRIGGERステートメントは、アカウントテーブルに関連付けられたins_sumというトリガーを作成します。また、トリガの動作時間、トリガイベント、およびトリガがアクティブになったときの対処方法を指定する句も含まれます
値を挿入
トリガを使用するには、アキュムレータ変数(@sum)をゼロに設定し、INSERT文を実行してから、変数が後でどのような値を持つかを確認します。
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
この場合、INSERT文が実行された後の@sumの値は、14.98 + 1937.50 - 100または1852.48です。
ドロップトリガー
mysql> DROP TRIGGER test.ins_sum;
表をドロップすると、表のトリガーもドロップされます。
トリガーの種類
タイミング
トリガアクション時間修飾子は2つあります。
-
BEFORE
トリガーが要求を実行する前にアクティブになり、 -
AFTER
変更後のトリガー火。
トリガーイベント
トリガーをアタッチできるイベントは3つあります。
-
INSERT
-
UPDATE
-
DELETE
挿入前のトリガーの例
DELIMITER $$
CREATE TRIGGER insert_date
BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
-- set the insert_date field in the request before the insert
SET NEW.insert_date = NOW();
END;
$$
DELIMITER ;
更新前のトリガの例
DELIMITER $$
CREATE TRIGGER update_date
BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
-- set the update_date field in the request before the update
SET NEW.update_date = NOW();
END;
$$
DELIMITER ;
削除後のトリガの例
DELIMITER $$
CREATE TRIGGER deletion_date
AFTER DELETE ON stack
FOR EACH ROW
BEGIN
-- add a log entry after a successful delete
INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;
$$
DELIMITER ;
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow