【MySQL】トリガー

■ トリガー

 * テーブル操作(UPDATE/INSERT/DELETE)が行われた時に
   イベント駆動で実行する仕組み

■ トリガーの作成

構文

DELIMITER //
CREATE TRIGGER 【トリガー名】 【BEFORE or AFTER】 【INSERT or UPDATE or DELETE】 ON 【対象テーブル名】
FOR EACH ROW
BEGIN
  -- 【この中に実行するSQLを記述】
END;
//

サンプル

DELIMITER //
CREATE TRIGGER `say_hello_after_insert` AFTER INSERT ON person
FOR EACH ROW
BEGIN
  INSERT INTO customer(first_name, family_name) VALUES('Unknown', NEW.name);
END;
//
テーブル定義
CREATE TABLE `person` (
	`id` CHAR(8) NOT NULL,
	`name` VARCHAR(40) NULL DEFAULT NULL,
	`sex` CHAR(1) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

CREATE TABLE `customer` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`first_name` VARCHAR(50) NULL DEFAULT NULL,
	`family_name` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=8
;
動作確認用ストアド
INSERT INTO person(id, name, sex) VALUES('X0007', 'Kim', 'm');

-- 実行後 customer を確認しデータが挿入された

■ イベントの表示

SHOW TRIGGERS;

# イベントの内容を確認
-- SHOW CREATE TRIGGER 【イベント名】;
SHOW CREATE TRIGGER say_hello_after_insert;

■ トリガーの削除

構文

DROP TRIGGER IF EXISTS 【イベント名】;

サンプル

DROP TRIGGER IF EXISTS say_hello_after_insert;

■ 古い値/新しい値の参照

NEW.カラム名 ... INSERT/UPDATEで使用可能
OLD.カラム名 ... DELETE/UPDATEで使用可能


関連記事

MySQL】ストアドプロシージャ / ストアドファンクション

https://blogs.yahoo.co.jp/dk521123/37433118.html

MySQL】イベントスケジューラ

https://blogs.yahoo.co.jp/dk521123/27226901.html