サーチ…


構文

  • 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失敗した場合、古いトリガーを失います
  • 重い負荷では、 DROPCREATE間で他の操作が発生する可能性があります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