phpMyAdminを通してSQL文を実行し一括置換を行おうと思っています。
その際、対象データ量が大量のため、
置換前と置換後の差分をログとして残したいと思っています。
また、本実行の前にテスト的にSQL文を流して(実際は更新しない)
結果を出力させる方法もあったらなと思います。
有効な参考ページや方法ございましたらご教授願えますでしょうか。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ログテーブルを定義しておき、
①変更前の内容をログテーブルに追加
②変更後の内容をログテーブルに追加
③変更後の内容を置換先に反映
実際に更新しない場合には③を実行しない。
ログテーブルを結果として書き込むのではなく、予定として書き込むのがミソです。
ログテーブルのレイアウトとしては、変更前後をカラムとして持つのでも良いですけど、
ステータス用のカラムを持たせ、別なレコードとして管理する方が処理ロジックは短くてすみます。
まあ、資料として整形された形でフォーマットしておくか、資料を出力する際に整形するかの違いが大きいところですけど、列方向に展開するより行方向に展開する方が、正規化の観点からはお薦めです。
投稿2017/09/22 05:40
編集2017/09/22 05:44総合スコア25188
0
ベストアンサー
ぱっと考えられるのは2点
- triggerで外部に履歴を残す
AFTER INPUT/AFTER UPDATEなどで別DBにデータを保持します
ただしこの運用だとテストには向いていないかもしれません
- トランザクションで処理
更新日時をtimestampなどで確保すれば
commit前に検証してrollbackすればいいかもしれません
ただしあまり大量のデータをトランザクションで保持するのはどうかとおもうので
毎回テストするような運用は避けたほうがいいかもしれません
sample trigger
テーブル作成
SQL
1create table tblA(aid int not null primary key auto_increment,val1 int,val2 varchar(10)); 2create table tblB(bid int not null primary key auto_increment,aid int not null,val1 int,val2 varchar(10),tbla_modified datetime);
トリガー作成
SQL
1drop trigger if exists trg_a ; 2delimiter // 3create trigger trg_a after update on tblA 4for each row begin 5insert into tblB(aid,val1,val2,tbla_modified) values(OLD.aid,OLD.val1,OLD.val2,NOW()); 6end; 7// 8delimiter ;
データ投入
SQL
1insert into tblA(val1,val2) values(10,'test1'),(20,'test2'),(30,'test3'),(30,'test4');
※triggerはtblAのupdateを元にするのでinsert時にはtblBに影響はない
データ更新
SQL
1update tblA set val2='test5' where val1=30;
※tblAの更新された行を元にtblBにtblAの古いデータが保持され、更新された時間が記載される
なので、tblAを元に戻したいのであれば更新日時をキーにtblBからtblAにデータを
流し込めばよい
投稿2017/09/22 05:57
編集2017/09/22 06:52総合スコア114829
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/22 06:10
2017/09/22 06:17
2017/09/22 06:52
2017/09/22 07:22
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。