質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1062閲覧

MySQLにおいての更新時の差分ログについて

sk1013

総合スコア39

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/09/22 05:13

phpMyAdminを通してSQL文を実行し一括置換を行おうと思っています。

その際、対象データ量が大量のため、
置換前と置換後の差分をログとして残したいと思っています。

また、本実行の前にテスト的にSQL文を流して(実際は更新しない)
結果を出力させる方法もあったらなと思います。

有効な参考ページや方法ございましたらご教授願えますでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ログテーブルを定義しておき、
①変更前の内容をログテーブルに追加
②変更後の内容をログテーブルに追加
③変更後の内容を置換先に反映

実際に更新しない場合には③を実行しない。

ログテーブルを結果として書き込むのではなく、予定として書き込むのがミソです。

ログテーブルのレイアウトとしては、変更前後をカラムとして持つのでも良いですけど、
ステータス用のカラムを持たせ、別なレコードとして管理する方が処理ロジックは短くてすみます。
まあ、資料として整形された形でフォーマットしておくか、資料を出力する際に整形するかの違いが大きいところですけど、列方向に展開するより行方向に展開する方が、正規化の観点からはお薦めです。

投稿2017/09/22 05:40

編集2017/09/22 05:44
sazi

総合スコア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
yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk1013

2017/09/22 06:03

回答ありがとうございます。 ・triggerで外部に履歴を残す →別DBを用意するのは結構難しいと思います…できて別テーブルでしょうか。 ・トランザクションで処理 →運用中の更新、かつ更新データが数万件あるためトランザクション管理はおっしゃる通り避けたいですね… わがまますぎて、八方塞がりなのですが データ内容的に誤るとサイトが飛んじゃうレベルなのでよりよい方法を模索したい次第です…
yambejp

2017/09/22 06:10

> 別DBを用意するのは結構難しい 書き方が悪くてスミマセン、別テーブルで大丈夫です trigger自体テーブルAが更新されるとテーブルBにデータが追加されるというような ログのようなしくみです。
sk1013

2017/09/22 06:17

トリガを使うとすると 本テーブル(UPDATE)→ログテーブル(INSERT) という感じで本テーブルで更新が走ると、 ログテーブルには更新行のみ追加される、という認識です。 こちらも言い方が悪くて申し訳ないのですが、 ログというよりはテスト施行結果がほしいという感じですね。 更新自体でミスれないなので後からログを見直すというよりは 想定結果が知りたいという感じです。
yambejp

2017/09/22 06:52

一応triggerのサンプルをつけておきました。
sk1013

2017/09/22 07:22

ありがとうございますー。こちら参考にさせていただきますー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問