MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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句を使う方法が最も確実です。

  1. MySQLでテーブルが存在するかどうかを確認する方法【INFORMATION_SCHEMA.TABLES活用】

    MySQLでテーブルの存在を確認するにはMySQLにおいて、特定のテーブルがデータベース内に存在するかどうかを確認したい場合、INFORMATION_SCHEMA.TABLES を利用するのが一般的な方法です。このシステムビューには、サーバー上のすべてのデータベースとテーブルに関するメタデータが格納されており、これを参照することで目的のテーブルが存在するかを簡単に調べられます。基本構文テーブルの存在確認は、以下のようなSELECT文で行います。select table_name from information_schema.tables where table_schema=database

  2. 【MySQL】テーブルの重複行を削除して1行だけ残す方法

    MySQLのテーブルから重複行を削除して1行だけ残したい場合は、「一時テーブル(Temporary Table)」の仕組みを利用するのが簡単で確実な方法です。全体の流れは以下の4ステップになります。 DISTINCTを使って一時テーブルを作成 ― 元テーブルから重複を除外したデータを抽出して保存します。 元テーブルをTRUNCATEで空にする 一時テーブルのデータを元テーブルへ再挿入する 一時テーブルをDROPで削除する create table anytemporaryTableName as select distinct yourColumnName1, yourColumnName