🖨️
【Oracle】既存テーブルのコピーを作成する(データあり/なし)
既に存在するテーブルのコピーを作成する方法を紹介します。
以下の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制約、パーティション化条件、索引および列のデフォルト値は、新しい表に引き継がれません。
記事には載せていませんが、NOT NULL制約はコピーできることを確認しています。
Discussion