MySQLでテーブル・インデックス・データを丸ごと複製(クローン)する方法
MySQLでテーブルを複製する基本の考え方
MySQLでテーブルを丸ごと複製(クローン)したい場合、「LIKE」句を使うのが基本です。「CREATE TABLE ... LIKE」を使うと、カラム定義だけでなくインデックスも含めたテーブル構造をそのままコピーできます。さらに「INSERT ... SELECT」文を組み合わせれば、データまでまとめて複製可能です。
ここでは「business」というデータベースを例に、実際の手順を順番に見ていきましょう。
1. データベースの選択とテーブル一覧の確認
まず、対象となるデータベースを選択します。
mysql> USE business;
Database changed
続いて、データベース内のテーブル一覧を表示します。このデータベースには63個のテーブルが存在します。
mysql> SHOW tables;
+------------------------+
| Tables_in_business |
+------------------------+
| addcolumntable |
| autoincrement |
| autoincrementtable |
| bookindexes |
| ...(中略・全63テーブル) |
| varchardemo |
| varcharurl |
| whereconditon |
+------------------------+
63 rows in set (0.25 sec)
2. 元テーブルの構造とデータを確認する
今回は「student」テーブルを複製します。まずDESCコマンドでテーブル構造を確認しましょう。
mysql> DESC student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| Name | varchar(100) | YES | MUL | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.20 sec)
Key列に「MUL」と表示されていることから、id列とName列にはインデックスが設定されていることがわかります。このインデックスまで含めて複製できるかどうかが、後ほど検証のポイントになります。
次に、テーブル内のレコードを確認します。
mysql> SELECT * FROM student;
+------+------+
| id | Name |
+------+------+
| 1 | John |
| 2 | Bob |
+------+------+
2 rows in set (0.00 sec)
3. LIKE句でテーブルを複製する
いよいよ複製です。「CREATE TABLE ... LIKE」を実行すると、元テーブルと同じ構造(インデックスを含む)を持つ新しいテーブルが作成されます。
mysql> CREATE TABLE cloneStudent LIKE student;
Query OK, 0 rows affected (1.57 sec)
続いて、INSERT ... SELECT文で元テーブルのデータを新しいテーブルへコピーします。
mysql> INSERT INTO cloneStudent SELECT * FROM student;
Query OK, 2 rows affected (0.60 sec)
Records: 2 Duplicates: 0 Warnings: 0
これで、構造・インデックス・データを備えた複製テーブルが完成しました。
4. 複製結果を検証する
まずDESCコマンドで複製テーブルの構造を確認します。元テーブルと同じくKey列に「MUL」が表示されており、インデックスまで正しく複製されていることがわかります。
mysql> DESC cloneStudent;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| Name | varchar(100) | YES | MUL | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
最後に、データが正しくコピーされているか確認しましょう。
mysql> SELECT * FROM cloneStudent;
+------+------+
| id | Name |
+------+------+
| 1 | John |
| 2 | Bob |
+------+------+
2 rows in set (0.00 sec)
まとめ
MySQLでテーブルをインデックスごと複製するには、次の2ステップが基本です。
- CREATE TABLE 新テーブル LIKE 元テーブル; … 構造とインデックスを複製
- INSERT INTO 新テーブル SELECT * FROM 元テーブル; … データをコピー
なお、「CREATE TABLE ... AS SELECT ...」を使う方法でもデータはコピーできますが、この場合インデックスやAUTO_INCREMENT属性などは引き継がれない点に注意が必要です。構造・インデックス・データをすべて忠実に複製したい場合は、LIKE句を使う方法が最も確実です。
-
MySQLでテーブルが存在するかどうかを確認する方法【INFORMATION_SCHEMA.TABLES活用】
MySQLでテーブルの存在を確認するにはMySQLにおいて、特定のテーブルがデータベース内に存在するかどうかを確認したい場合、INFORMATION_SCHEMA.TABLES を利用するのが一般的な方法です。このシステムビューには、サーバー上のすべてのデータベースとテーブルに関するメタデータが格納されており、これを参照することで目的のテーブルが存在するかを簡単に調べられます。基本構文テーブルの存在確認は、以下のようなSELECT文で行います。select table_name from information_schema.tables where table_schema=database
-
【MySQL】テーブルの重複行を削除して1行だけ残す方法
MySQLのテーブルから重複行を削除して1行だけ残したい場合は、「一時テーブル(Temporary Table)」の仕組みを利用するのが簡単で確実な方法です。全体の流れは以下の4ステップになります。 DISTINCTを使って一時テーブルを作成 ― 元テーブルから重複を除外したデータを抽出して保存します。 元テーブルをTRUNCATEで空にする 一時テーブルのデータを元テーブルへ再挿入する 一時テーブルをDROPで削除する create table anytemporaryTableName as select distinct yourColumnName1, yourColumnName