SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【MySQL】INSERT,UPDATE,DELETEの処理時にSQLを自動的に実行する

問題

MySQLだけで、UPDATEを実行する前に、更新前のレコードをまるっと別テーブルにコピー(更新履歴として残す)したい。

mysql

答え

[準備]

事前に同じ構成(*)のテーブルを二つ用意(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を発行しても全部エラーということがありえます。

関連するメモ

コメント