4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?