🖨️

【Oracle】既存テーブルのコピーを作成する(データあり/なし)

2024/06/23に公開

既に存在するテーブルのコピーを作成する方法を紹介します。

以下の2パターンを紹介します。

  1. 既存のテーブルと同じ構造&データのテーブルを作成する
  2. 既存のテーブルと同じ構造のテーブルを作成する

検証環境

  • Oracle Database 19c for Linux
  • Oracle VM VirtualBox

使用するテーブル

以下の構造&データのテーブルをもとにコピーを作成します。

SQL> SELECT * FROM TEST_TABLE_1;

        ID NAME
---------- --------------------------------------------------
         1 TARO
         2 KEN

作成する場合は以下のDDLを実行してください。

CREATE TABLE TEST_TABLE_1 (
    ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(50)
);
INSERT INTO TEST_TABLE_1 (ID, NAME) VALUES (1, 'TARO');
INSERT INTO TEST_TABLE_1 (ID, NAME) VALUES (2, 'KEN');
COMMIT;

1. 既存のテーブルと同じ構造&データのテーブルを作成する

既存のテーブルと同じ構造&データの「TEST_TABLE_2」テーブルを作成します。

▼ 実行手順

# 既存のテーブルと同じ構造/データのテーブルを作成する。
CREATE TABLE TEST_TABLE_2
AS SELECT * FROM TEST_TABLE_1;

# テーブルが作成されたことを確認する(データあり)。
SELECT * FROM TEST_TABLE_2;

▼ 実行ログ

SQL> CREATE TABLE TEST_TABLE_2
  2  AS SELECT * FROM TEST_TABLE_1;

表が作成されました。

SQL>
SQL> SELECT * FROM TEST_TABLE_2;

        ID NAME
---------- --------------------------------------------------
         1 TARO
         2 KEN

SQL>

2. 既存のテーブルと同じ構造のテーブルを作成する

「WHERE 1=0」は常にfalseになるため、データはselectされません。
その結果、構造のみ同じテーブルが作成されます。

既存のテーブルと同じ構造の「TEST_TABLE_3」テーブルを作成します。

▼ 実行手順

# 既存のテーブルと同じ構造のテーブルを作成する。
CREATE TABLE TEST_TABLE_3
AS SELECT * FROM TEST_TABLE_1 WHERE 1=0;

# 同じ構造のテーブルが存在することを確認する。
desc TEST_TABLE_3

# データが存在しないことを確認する。
SELECT * FROM TEST_TABLE_3;

▼ 実行ログ

SQL> CREATE TABLE TEST_TABLE_3
  2  AS SELECT * FROM TEST_TABLE_1 WHERE 1=0;

表が作成されました。

SQL>
SQL> desc TEST_TABLE_3
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(50)

SQL>
SQL> SELECT * FROM TEST_TABLE_3;

レコードが選択されませんでした。

SQL> 

Appendix.

Oracleの公式ドキュメントには以下の通り記載されています。

データ型およびデータ長は、副問合せから導出されます。整合性制約や、その他の列および表の属性には次の規則が適用されます。

.主キー、一意キー、外部キー、CHECK制約、パーティション化条件、索引および列のデフォルト値は、新しい表に引き継がれません。

https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-TABLE.html

記事には載せていませんが、NOT NULL制約はコピーできることを確認しています。

Discussion