Oracleでテーブルコピーを実施する方法です。テーブルのバックアップを作成する時に高頻度で使用すると思います。
テーブルのコピー
テーブルのコピー、つまり複製ですが、3つの結果によって少しだけSQLを変える必要があります。
- テーブルのデータを丸ごとコピー
- テーブルのデータの一部をコピー
- テーブルの構造(定義)だけコピー
コピーの結果がどうなるかによって、SQLを変える必要があるので注意して下さい。
テーブルのデータごとコピーする
テーブルのデータごと、つまり、テーブル定義とデータをそのままコピーする場合、次の様にSQLを書けばOKです。
CREATE TABLE "新規作成するテーブル" AS SELECT * FROM "コピー元テーブル";
ぶっちゃけこれだけです。実際に実行してみます。今「TAB_PRODUCT_FRUIT」というテーブルがあるので、これを「NEW_TAB_PRODUCT_FRUIT」というテーブルの名前で複製します。コピー元のテーブルの状態はこんな感じです。
テーブルをコピーします。次のSQLを作成しました。
CREATE TABLE NEW_TAB_PRODUCT_FRUIT AS SELECT * FROM TAB_PRODUCT_FRUIT;
実際に実行しましょう。
では、新しく作成したテーブルを見てみます。
データが入っています。
テーブルのデータの一部をコピー
テーブルのデータの一部をコピーして複製する場合、WHERE句に条件を指定することで実現可能です。
CREATE TABLE "新規作成するテーブル" AS SELECT * FROM "コピー元テーブル" WHERE COL_1 = "条件";
先ほどと同じように「TAB_PRODUCT_FRUIT」というテーブルをコピー元にして、一部のデータだけコピーしたテーブルを作成します。
CREATE TABLE NEW_TAB_PRODUCT_FRUIT_1 AS SELECT * FROM TAB_PRODUCT_FRUIT WHERE CODE = '001';
実行後に「NEW_TAB_PRODUCT_FRUIT_1」テーブルが出来て、「CODE」カラムの値が「001」のデータのみ入っていれば成功です。実際に実行してみましょう。
エラーにはなっていませんね。実際に「NEW_TAB_PRODUCT_FRUIT_1」の中身を確認してみます。
大丈夫みたいですね。
テーブルの構造だけコピーする
テーブルの構造だけコピーする場合は、ちょっと工夫してWHERE句を付けてあげる必要があります。構文は次に様に書けばOKです。
CREATE TABLE "新規作成するテーブル" AS SELECT * FROM "コピー元テーブル" WHERE 1 <> 1;
ちょっと意味分からない…と言う人は、とりあえずWHERE句をコピペで良いと思います。先ほどと同じように「TAB_PRODUCT_FRUIT」というテーブルをコピー元にしてテーブル定義のみを複製してみます。
CREATE TABLE NEW_TAB_PRODUCT_FRUIT_2 AS SELECT * FROM TAB_PRODUCT_FRUIT WHERE 1 <> 1;
では実行しましょう。
果たして中身は…
「データが見つかりません」という絶妙な返事が来ましたね。テーブルがなければエラーメッセージ「ORA-00942: 表またはビューが存在しません。」と怒られるので、テーブルは存在します。念のためレコード数を取得してみましょうか。
見事に0件ですね。これでテーブル定義だけがコピーされたことが分かると思います。
関連記事
参考サイト
.