ストアドプロシージャやトリガーは、ある一定のリテラシー(スキル)環境で構築しないと不透明ゆえに見落としや利便性の是非が判断しにくい。
でも、めんどくさがりな自分としては時々実装しておきたくなったりする。
自宅では迷惑もかけないので実装していく方向で。
ポケットウォーズのテーブル定義再構築にあたって、まずzeni_logsへのトリガー実装。
ゼニが増えた(減った)ログがzeni_logsに生成されると、zeni_logsのchange値でuser_dataのzeniを更新。
トリガー
delimiter //
create trigger trigger_zeni after insert on `zeni_logs`
for each row
begin
update `user_data` set `zeni` = `zeni` + new.`change` where `users_id` = new.`users_id`;
end // ← phpMyAdminで実行するときは最後のデミリタは不要
あー、大晦日。
ストアドプロシージャのメモ:
delimiter //
create procedure proc_zeni(in _users_id int, in _change int, in _event varchar(8))
begin
declare done int default 1;
declare _zeni int;
declare _total int;
declare cur cursor for
select `zeni` from `user_data` where `users_id` = _users_id;
declare exit handler for not found set done = 0;
declare
if _event = '' then set _event = '00000000'; end if;
open cur;
while done do
fetch cur into _zeni;
set _total = _zeni + _change;
insert into `zeni_logs` (`users_id`,`change`,`total`,`event`) values (_users_id, _change, _total, _event);
end while;
close cur;
end // ← phpMyAdminで実行するときは最後のデミリタは不要
-- drop procedure proc_zeni;
call proc_zeni(1,100,'');
proc_zeni(int users_id, int change, string event)
参考:
例外処理(DECLARE ... HANDLER) - bnote
http://www.bnote.net/mysql/appendix/exception.shtml