忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

MySQL 同一構造のテーブルで片方が存在しないデータのコピーの方法について(INSERT ... SELECT ... EXISTS)

トランザクション的なテーブルを、同一構造のワークテーブルにバックアップコピーを取っておいて、 ワークテーブルから元のテーブルに差分を復活させたい場合がよくあると思います。

とあるシステムのデバッグを行う時に、元のテーブルに対して削除処理が入る場合、 デバッグの前にワークテーブルにバックアップコピーを取っておきます。
その後、デバッグを行っていると削除でデータが無くなるので、データの復活が出来れば、再度最初からデバッグ処理が行えます。
そこで、最初にバックアップを行うSQLから示します。
尚、今回のテストではテーブルの内容については深く考えていませんので、テーブル名は TT_TEST としワークテーブルは TW_TEST とし、 データをにはユニークキーとして KEY の名前のカラムが存在するとします。

バックアップを行うSQL

' ワークテーブルの作成
CREATE TABLE TW_TEST LIKE TT_TEST;

' ワークテーブルへのコピー
TRUNCATE TABLE TW_TEST;
INSERT INTO TW_TEST SELECT * FROM TT_TEST;

取敢えず、ワークテーブルの作成についても記しています。
CREATE TABLE ... LIKE ステートメント」はすでに存在するテーブルのテーブル定義のみをコピーして、新規にテーブルを作成することができます。
なお、オラクルのSQLでも同様のことができるようです。

実テーブルに存在しないワークテーブルのレコードの追加を行うSQL

MySQLにはオラクルの様に集合演算子の MINUS が無いため、ユニークキーの結合で存在しないものを選択し、そのデータをINSERTすることになります。
SQLは以下の様になります。

INSERT INTO TT_TEST
SELECT *
FROM TW_TEST AS T1
WHERE NOT EXISTS (
	SELECT *
	FROM TT_TEST AS T2
	WHERE T1.KEY = T2.KEY
);











PR

コメント

コメントを書く