MySQLのテーブル複製コマンドの違い

MySQL(MariaDB)にてテーブルの複製コマンドは複数存在するが、
どういった差異があるのかが不明だったので、showコマンドを使用して確認、比較してみた。
結果は下記の通り。

| | データ | index | PK |
| --- | --- | --- | --- | --- |
| create table ･･･ as SELECT文 | 有 | 無 | 無 |
| create table ･･･ (SELECT文) | 有 | 無 | 無 |
| create table ･･･ SELECT文 | 有 | 無 | 無 |
| create table ･･･ like <元テーブル> | 無 | 有 | 有 |

この内容からはcreate table ･･･ like文はテーブル定義を関連オブジェクトも含めて複製するが、
それ以外のcreate table ･･･ SELECT文についてはテーブルとデータの複製を実施する、
というSQLの作り通りの動作が見えた。

## create table ･･･ as SELECT文

```sql:as
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]> SHOW CREATE TABLE juve_as;
+---------+--------------------------------------------------------------------
| Table   | Create Table
+---------+--------------------------------------------------------------------
| juve_as | CREATE TABLE `juve_as` (
  `id_no` int(11) NOT NULL COMMENT 'ID',
  `no` varchar(5) NOT NULL COMMENT '背番号',
  `fir_name` varchar(25) DEFAULT NULL COMMENT '名前',
  `fam_name` varchar(25) DEFAULT NULL COMMENT '姓',
  `position` varchar(3) NOT NULL COMMENT 'ポジション'
) ENGINE=InnoDB DEFAULT CHARSET=utf8            |
+---------+--------------------------------------------------------------------
1 row in set (0.00 sec)
```

## create table ･･･ (SELECT文)

```sql:()
MariaDB [iwate]> create table juve2 (select * from juve where position='MF');
Query OK, 6 rows affected (0.11 sec)
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [iwate]> SHOW CREATE TABLE juve2;
+-------+-------------------------------------------------------------------------
| Table | Create Table
+-------+-------------------------------------------------------------------------
| juve2 | CREATE TABLE `juve2` (
  `id_no` int(11) NOT NULL COMMENT 'ID',
  `no` varchar(5) NOT NULL COMMENT '背番号',
  `fir_name` varchar(25) DEFAULT NULL COMMENT '名前',
  `fam_name` varchar(25) DEFAULT NULL COMMENT '姓',
  `position` varchar(3) NOT NULL COMMENT 'ポジション'
) ENGINE=InnoDB DEFAULT CHARSET=utf8            |
+-------+-------------------------------------------------------------------------
1 row in set (0.00 sec)
```

## create table ･･･ SELECT文

```sql:SELECT文
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]> SHOW CREATE TABLE juve_non;
+---------+--------------------------------------------------------------------
| Table   | Create Table
+---------+--------------------------------------------------------------------
| juve_non | CREATE TABLE `juve_non` (
  `id_no` int(11) NOT NULL COMMENT 'ID',
  `no` varchar(5) NOT NULL COMMENT '背番号',
  `fir_name` varchar(25) DEFAULT NULL COMMENT '名前',
  `fam_name` varchar(25) DEFAULT NULL COMMENT '姓',
  `position` varchar(3) NOT NULL COMMENT 'ポジション'
) ENGINE=InnoDB DEFAULT CHARSET=utf8            |
+---------+--------------------------------------------------------------------
1 row in set (0.00 sec)
```

## create table ･･･ like <元テーブル>

```sql:LIKE
MariaDB [iwate]> create table juve_like like juve;
Query OK, 0 rows affected (0.08 sec)

MariaDB [iwate]> SHOW CREATE TABLE juve_like;
+-----------+------------------------------------------------------------------
| Table     | Create Table
+-----------+------------------------------------------------------------------
| juve_like | CREATE TABLE `juve_like` (
  `id_no` int(11) NOT NULL COMMENT 'ID',
  `no` varchar(5) NOT NULL COMMENT '背番号',
  `fir_name` varchar(25) DEFAULT NULL COMMENT '名前',
  `fam_name` varchar(25) DEFAULT NULL COMMENT '姓',
  `position` varchar(3) NOT NULL COMMENT 'ポジション',
  PRIMARY KEY (`id_no`),
  KEY `ix1_juve` (`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユベントス'
+-----------+------------------------------------------------------------------
1 row in set (0.00 sec)
```