【MySQL】テーブルの複製(CREATE TABLE [ LIKE | SELECT FROM ] )

【MySQL】テーブルの複製(CREATE TABLE [ LIKE | SELECT FROM ] )

MySQLのテーブル複製について解説します。

検証環境

テーブル複製

既存のテーブルを複製して、新しいテーブルの作成が可能です。

作成方法はデータも複製するかどうかで2つのパターンがあります。

データの複製なし

データの複製はなし、つまりテーブル定義のみ複製する場合は、CREATE TABLE LIKE文を使います。

基本構文

CREATE TABLE 複製テーブル名 LIKE 複製元テーブル名

サンプル

mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| price | int         | YES  |     | NULL    |                |
| stock | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM items;
+----+-----------+-------+-------+
| id | name      | price | stock |
+----+-----------+-------+-------+
|  1 | Apple     |   200 |    10 |
|  2 | Orange    |   150 |     3 |
|  3 | Pineapple |  1100 |     3 |
|  4 | Grapes    |  3500 |     1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)

___ih_hl_start
mysql> CREATE TABLE fruits LIKE items;
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)

mysql> DESC fruits;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| price | int         | YES  |     | NULL    |                |
| stock | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM fruits;
Empty set (0.00 sec)

23行目でitemsテーブルからfruitsテーブルを複製しています。

データの複製あり

データも複製する場合は、CREATE TABLE SELECT FROM文を使います。

基本構文

CREATE TABLE 複製テーブル名 SELECT 複製カラム FROM 複製元テーブル名

サンプル

mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| price | int         | YES  |     | NULL    |                |
| stock | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> SELECT * FROM items;
+----+-----------+-------+-------+
| id | name      | price | stock |
+----+-----------+-------+-------+
|  1 | Apple     |   200 |    10 |
|  2 | Orange    |   150 |     3 |
|  3 | Pineapple |  1100 |     3 |
|  4 | Grapes    |  3500 |     1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)

___ih_hl_start
mysql> CREATE TABLE fruits SELECT * FROM items;
___ih_hl_end
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> DESC fruits;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   |     | 0       |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| price | int         | YES  |     | NULL    |       |
| stock | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> SELECT * FROM fruits;
+----+-----------+-------+-------+
| id | name      | price | stock |
+----+-----------+-------+-------+
|  1 | Apple     |   200 |    10 |
|  2 | Orange    |   150 |     3 |
|  3 | Pineapple |  1100 |     3 |
|  4 | Grapes    |  3500 |     1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)

23行目でitemsテーブルからfruitsテーブルを複製しています。

*で全てのカラムを指定していますが、特定のカラムのみ指定することも可能です。

___ih_hl_start
mysql> CREATE TABLE fruits SELECT id, name FROM items;
___ih_hl_end
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM fruits;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Apple     |
|  2 | Orange    |
|  3 | Pineapple |
|  4 | Grapes    |
+----+-----------+
4 rows in set (0.00 sec)