MySQLトリガを試してみる
Trigger..DB2の時もそうだったけど、運用が大変なんだよな。。と思いつつ、何かDBをやるたびに、突如トリガを試してみたくなったので検証してみました。 今回の検証では、ソーステーブルに、INSERT,UPDATE,DELETEが走った場合、trigger_tbl_cloneに必要なtrigger_tbl_srcのカラムのみを出力してコンパクトなテーブルを作ってみるなんていう検証です。
1. 下記テーブルを作成する
CREATE TABLE trigger_tbl_clone
(
id
bigint(19) NOT NULL AUTO_INCREMENT,
col2
enum('on','off') NOT NULL DEFAULT 'on',
limit
enum('member','open') NOT NULL,
created
datetime NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. データをの流し込みを行う
truncate table trigger_tbl_clone;
insert into trigger_tbl_clone select id,col2,limit
,created from trigger_tbl_src;
3. トリガを生成する
インサートトリガ
delimiter // CREATE TRIGGER trigger_tbl_clone_ins AFTER INSERT ON trigger_tbl_src FOR EACH ROW BEGIN insert into trigger_tbl_clone values (NEW.id,NEW.col2,NEW.limit,NEW.created); END;// delimiter ;
# UPDATEトリガ
delimiter //
CREATE TRIGGER trigger_tbl_clone_upd AFTER UPDATE ON trigger_tbl_src
FOR EACH ROW
BEGIN
update trigger_tbl_clone
set
id = NEW.id,
col2 = NEW.col2,
limit
= NEW.limit
,
created = NEW.created
where
id = NEW.id;
END;//
delimiter ;
# DELETEトリガ delimiter // CREATE TRIGGER trigger_tbl_clone_del AFTER DELETE ON trigger_tbl_src FOR EACH ROW BEGIN delete from trigger_tbl_clone where id = OLD.id; END;// delimiter ;
動作検証
検証を開始しようと思ったらエラーが、、あららららららら
INSERT INTO trigger_tbl_src
(name
, category
, limit
, accept
, origi_url
, info
, adm
, created
) VALUES ('21313313113131331', 0, 'open', 'not_need', '', '132132131213211321131313131', 61, '2011-01-06 20:12:03')"
1558: Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50077, now running 50153. Please use mysql_upgrade to fix this error."
MySQLのバグらしく以下のコマンドを実行し再度トライ
# mysql_upgrade -p
※MySQLのバグらしく、上記コマンドを流せば、この問題は解決されます。
改めて検証を開始 新規コミュニティー作成
- trigger_tbl_src反映確認
mysql> select * from trigger_tbl_src order by id desc limit 1\G; 1. row id: 3488 disp_id: 4715347248 col2: on name: トリガを検証中です。 adm: 53 official: off category: 4 limit: open accept: need ext: no img_key: NULL origi_url: info: この検証はトリガーが正常に稼動するかの検証テーブルです created: 2011-01-06 20:45:41
- trigger_tbl_clone 反映確認 trigger_tbl_srcの反映内容を元にtrigger_tbl_cloneが新規で作成されていることを確認
mysql> select * from trigger_tbl_clone order by id desc limit 1\G; 1. row id: 3488 col2: on limit: open created: 2011-01-06 20:45:41 1 row in set (0.00 sec)
★trigger_tbl_src反映確認
mysql> select * from trigger_tbl_src order by id desc limit 1\G; 1. row id: 3488 disp_id: 4715347248 col2: on name: トリガを検証中です。 adm: 53 official: off category: 4 limit: member accept: not_need ext: no img_key: NULL origi_url: info: この検証はトリガーが正常に稼動するかの検証テーブルです created: 2011-01-06 20:45:41 1 row in set (0.00 sec)
1. trigger_tbl_clone 反映確認 trigger_tbl_srcの変更に合わせtrigger_tbl_cloneも変更されていることを確認
mysql> select * from trigger_tbl_clone order by id desc limit 1\G; 1. row id: 3488 col2: on limit: member created: 2011-01-06 20:45:41 1 row in set (0.00 sec)
補足
- トリガのDROPは以下のような手順で行う
DROP TRIGGER trigger_tbl_clone_ins; DROP TRIGGER trigger_tbl_clone_upd; DROP TRIGGER trigger_tbl_clone_del;