DB別テーブル複製コマンド

各DBにて既存テーブルを複製作成するコマンドについてのまとめ。

truncateやdeleteなど作業を行う前にバックアップとしても使用できるし、
WHERE句などの条件を指定することで欲しい情報だけで新規にテーブルを作ったりできるので、
結構使うことが多いコマンド。

ただ、どのDBでもインデックスや主キーなどの制約は複製されないので、
それらは別途作成し直す必要がある。
個人的にはそれで面倒な目にあってきたのでDisk容量に余裕があれば、
作成時に使用したDDLや作成ファイルは保管しておいた方が後々楽になると思う。

## Oracle

```sql:例
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文などで投入する必要があるのでここでは除外。

```sql:例1
CREATE TABLE <新テーブル名> [AS] <SELECT文>;
CREATE TABLE new_table AS SELECT * FROM old_table;
```

```sql:例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

```sql:例
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のセルを分ける「|」がずれるのが気になる･･･
どうにかならないかなぁ･･･