DBのTABLE間のデータコピーについて
皆さんこんにちは、N.Tです。
なかなかブログというものを書くのが苦手なので、レイアウト等ちょっとずつ試行錯誤しています…。
今回は、データベースでのテーブルバックアップ時のデータ戻しについて話していきたいと思います。
DBの特定のテーブルに対しデータ処理のテストをする際、テスト後にデータを元に戻せるように
以下の様なSQLで別テーブルにバックアップを作成しておく事があります。
CREATE TABLE テーブルB AS SELECT * FROM テーブルA;
※テーブルA … テスト対象のテーブル
テーブルB … バックアップ
そして、テスト実施後にバックアップテーブルからSQLでテスト前の状態に戻す方法として
■手法①
①DROP TABLE テーブルA;
②CREATE TABLE テーブルA AS SELECT * FROM テーブルB;
という方法と
■手法②
①DELETE FROM テーブルA;
②INSERT INTO テーブルA SELECT * FROM テーブルB;
という方法があります。
どちらも実行後のテーブルデータは同じですが、どういった違いがあるでしょう?
手法①について
まず手法①ですが、こちらは一度データを戻す先のテーブルをDROPで削除し、その後テーブルBの
データを基にテーブルAを再作成するという方法です。
一見全部のデータが戻っているし問題無い様に見えるのですが、場合によっては問題が発生する
可能性があります。
それは、テーブルに対しINDEXや権限の設定をしていた場合、それが全て消えてしまう事です。
元々のテーブルBがテーブルAを元にCREATE TABLEで作成された際、テーブルAで設定した
INDEXや権限等の設定情報を引き継ぎません。
その為、テーブルBから再度CREATE TABLEでテーブルAを再作成してしまうと、テーブルAに
設定されていた情報が無くなってしまうのです。
手法②について
次に手法②ですが、こちらはテーブルAのデータのみを全て削除し、テーブルBのデータを
新たに追加するという方法です。
テーブルAを削除せずにデータのみを削除しているので、テーブルBのデータを入れ直しても
設定したINDEX等が消える事はありません。
まとめ
二つの手法の違いを紹介して見ましたがどうでしたか?
実行結果が同じ様に見えても、INDEXや権限がない事によってシステムに影響が出る可能性が
ありますので、テーブルにSQLでデータを戻す際は手法②で戻すのが無難ですね。
上記の例は、私も一度同じ様な経験がありましたので今回備忘録として書いてみました。
皆さんの参考になりますと幸いです。