【MySQL】INSERT,UPDATE,DELETEの処理時にSQLを自動的に実行する
問題
MySQLだけで、UPDATEを実行する前に、更新前のレコードをまるっと別テーブルにコピー(更新履歴として残す)したい。
答え
[準備]
事前に同じ構成(*)のテーブルを二つ用意(hoge, log_hoge)。
log_hoge は、主キーの指定除く。
[SQL]
CREATE TRIGGER save_log BEFORE UPDATE ON hoge FOR EACH ROW INSERT INTO log_hoge SELECT * FROM hoge WHERE hoge_id = OLD.hoge_id;
[SQL補足]
トリガ名 : save_log
実行タイミング : UPDATE実行直前(BEFORE UPDATE)
設定対象 : hogeテーブル
トリガで発動するSQL : INSERT INTO log_hoge SELECT * FROM hoge WHERE hoge_id = OLD.hoge_id
[その他補足]
・OLD.column_a NEW.column_aで更新前後のデータにアクセス可能
(INSERTの場合はOLDは無く、DELETEのときはNEWは無い)
・複数SQLも流せる
※ 1行ごとにSQLの区切りが必要。そのまま複数行書くと最初のセミコロンで終了判定されるので
SQLで一時的に区切り文字を変えておく必要がある
なお、最初に発行したUPDATE文などのSQLに何の問題も無くとも、TRIGGERに指定したSQLにエラーが発生する場合、いずれのSQLも処理されませんでした。
今回のケースだと、メインのテーブルはテーブル定義を変更して、ログ保存先のテーブルは定義を変更しなかった場合、いくらSQLを発行しても全部エラーということがありえます。
コメント