小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracleで既存のテーブルをコピーして別名のテーブルを作る方法

はじめに

Oracle DBにおいて、すでに存在するテーブルをコピーして、別名のテーブルを作るときにcopyコマンドみたいなものがあるのかと思っていたら、ちょっと違いました。
この記事では、既存のテーブルをコピーして、別名のテーブルを作成する方法について書いています。

Oracleの基本 ~データベース入門から設計/運用の初歩まで
渡部 亮太 相川 潔 日比野 峻佑 岡野 平八郎 宮川 大地
技術評論社
売り上げランキング: 65,273

Oracleでテーブルをコピーして別名のテーブルを作る

テーブルをコピーするには、create table文を使います。その際にコピー元のテーブルからselectしながら、create tableします。
以下の例では、table01をベースにtable01_copyを作っています。

CREATE TABLE table01_copy NOLOGGING PARALLEL
 AS SELECT * FROM table01;

※NOLOGGING PARALLELは指定しなくても問題ありませんが、指定すると高速化することができます。

レコードはコピーせずに、構造だけをコピーする

格納されているデータはコピーしないけど、データ構造だけさくっとコピーしたい場合は、以下のようにselect文の条件が常にfalseになるようにします。

CREATE TABLE table01_copy NOLOGGING PARALLEL
 AS SELECT * FROM table01 WHERE 1<>1;
検証

1.テスト用テーブルを作成して、データ登録後にコピーしてみます。

create table table01
(
  id number not null,
  name varchar2(50) not null,
  furigana varchar2(50),
  primary key(id)
);
INSERT INTO table01(ID, NAME, furigana) VALUES (1, '山田 太郎', 'やまだ たろう');
INSERT INTO table01(ID, NAME, furigana) VALUES (2, '佐藤 太郎', 'さとう たろう');
INSERT INTO table01(ID, NAME, furigana) VALUES (3, '鈴木 太郎', 'すずき たろう');

2.このtable01テーブルをコピーして、table01_copyを作成します。

CREATE TABLE table01_copy NOLOGGING PARALLEL
 AS SELECT * FROM table01;

table01_copyを見てみると、データは正常に登録できていることが確認できました。

NOT NULLの制約もコピーしてくれているみたいです。

ただ、インデックス(索引)はコピーしてくれていないようなので、create table後に手動でインデックスをつける必要があります。