各DBにて既存テーブルを複製作成するコマンドについてのまとめ。
truncateやdeleteなど作業を行う前にバックアップとしても使用できるし、
WHERE句などの条件を指定することで欲しい情報だけで新規にテーブルを作ったりできるので、
結構使うことが多いコマンド。
ただ、どのDBでもインデックスや主キーなどの制約は複製されないので、
それらは別途作成し直す必要がある。
個人的にはそれで面倒な目にあってきたのでDisk容量に余裕があれば、
作成時に使用したDDLや作成ファイルは保管しておいた方が後々楽になると思う。
Oracle
例
CREATE TABLE <新テーブル名> AS <SELECT文>;
CREATE TABLE new_table AS SELECT * FROM old_table;
SQL> select table_name from user_tables;
TABLE_NAME
--------------------------------------------
JUVE
MILLAN
SQL> select index_name,table_name from user_indexes
2 where table_name like 'JUVE%';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
PK_JUVE JUVE
IX1_JUVE JUVE
SQL>
SQL> create table juve2 as select * from juve where position='MF';
表が作成されました。
SQL> select table_name from user_tables;
TABLE_NAME
--------------------------------------------
JUVE
JUVE2
MILLAN
SQL>
SQL> select index_name,table_name from user_indexes
2 where table_name like 'JUVE%';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
PK_JUVE JUVE
IX1_JUVE JUVE
MySQL(MariaDB)
MySQL(MariaDBも)の場合、別コマンドでも同様のことが実施できる。
例1の"AS"は省略可能。
また、like演算子でインデックスも含めて同じ構造のテーブルの複製が可能だが、
like演算子の場合はデータは複製されないので注意。
データはテーブルの作成後に別途INSERT~SELECT文などで投入する必要があるのでここでは除外。
例1
CREATE TABLE <新テーブル名> [AS] <SELECT文>;
CREATE TABLE new_table AS SELECT * FROM old_table;
例2
CREATE TABLE <新テーブル名> (<SELECT文>);
CREATE TABLE new_table (SELECT * FROM old_table);
MariaDB [iwate]> show tables;
+-----------------+
| Tables_in_iwate |
+-----------------+
| iwample |
| juve |
| m_stock |
| millan |
| mytable |
+-----------------+
5 rows in set (0.00 sec)
MariaDB [iwate]> create table juve2 (select * from juve where position='MF');
Query OK, 6 rows affected (0.10 sec)
Records: 6 Duplicates: 0 Warnings: 0
MariaDB [iwate]>
MariaDB [iwate]> show tables;
+-----------------+
| Tables_in_iwate |
+-----------------+
| iwample |
| juve |
| juve2 |
| m_stock |
| millan |
| mytable |
+-----------------+
6 rows in set (0.00 sec)
MariaDB [iwate]>
MariaDB [iwate]> create table juve_as as select * from juve where position='MF';
Query OK, 6 rows affected (0.11 sec)
Records: 6 Duplicates: 0 Warnings: 0
MariaDB [iwate]>
MariaDB [iwate]> show tables;
+-----------------+
| Tables_in_iwate |
+-----------------+
| iwample |
| juve |
| juve2 |
| juve_as |
| m_stock |
| millan |
| mytable |
+-----------------+
7 rows in set (0.00 sec)
MariaDB [iwate]>
MariaDB [iwate]> create table juve_non select * from juve where position='MF';
Query OK, 6 rows affected (0.07 sec)
Records: 6 Duplicates: 0 Warnings: 0
MariaDB [iwate]>
MariaDB [iwate]> show tables;
+-----------------+
| Tables_in_iwate |
+-----------------+
| iwample |
| juve |
| juve2 |
| juve_as |
| juve_non |
| m_stock |
| millan |
| mytable |
+-----------------+
8 rows in set (0.00 sec)
PostgreSQL
例
CREATE TABLE <新テーブル名> AS <SELECT文>;
CREATE TABLE new_table AS SELECT * FROM old_table;
iwate=# \dt;
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+----------------------------------+----------+-----------
iwate | juve | テーブル | iwate
・・・
iwate=#
iwate=# create table juve2 as select * from juve where position='MF';
SELECT 6
iwate=#
iwate=# \dt
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+--------------------------------+---------+-----------
iwate | juve | テーブル | iwate
iwate | juve2 | テーブル | iwate
・・・
PostgreSQLのセルを分ける「|」がずれるのが気になる・・・
どうにかならないかなぁ・・・