はじめに
Oracle DBにおいて、すでに存在するテーブルをコピーして、別名のテーブルを作るときにcopyコマンドみたいなものがあるのかと思っていたら、ちょっと違いました。
この記事では、既存のテーブルをコピーして、別名のテーブルを作成する方法について書いています。
Oracleの基本 ~データベース入門から設計/運用の初歩まで
posted with amazlet at 19.09.29
渡部 亮太 相川 潔 日比野 峻佑 岡野 平八郎 宮川 大地
技術評論社
売り上げランキング: 65,273
技術評論社
売り上げランキング: 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後に手動でインデックスをつける必要があります。