導入:なぜテーブル複製が必要なのか
データベースの運用において、本番環境のデータを一時的に退避させたり、特定のクエリの検証環境を素早く構築したりする場面は頻繁に訪れます。既存テーブルの構成をそのまま流用して新しいテーブルを作成したい場合、手動でDDL(データ定義言語)を再作成するのは非効率であり、ミスも発生しやすくなります。MySQLが提供するテーブル複製機能を適切に使い分けることで、開発効率と作業の安全性を大幅に向上させることができます。
基礎知識:2つの主要な手法
MySQLでテーブルを複製する主な手段は「CREATE TABLE LIKE」と「CREATE TABLE SELECT」の2種類です。
1. CREATE TABLE LIKE
テーブルの「構造」を完璧にコピーするための手法です。カラム定義、インデックス、制約情報などがそのまま引き継がれますが、データはコピーされません。テストデータの入れ替えが前提の環境作成などに最適です。
2. CREATE TABLE SELECT
SELECT文の結果を基にテーブルを作成し、同時に「データ」もコピーします。ただし、インデックスやAUTO_INCREMENT属性などはコピーされないという制限があります。特定の期間のデータ抽出や、バックアップの一時領域作成によく使われます。
実装/解決策
実務では、目的によってこの2つを使い分ける必要があります。
構造のみを正確に複製したい場合:
CREATE TABLE new_table LIKE original_table;
データの一部を抽出して新しいテーブルを作りたい場合:
CREATE TABLE new_table AS SELECT FROM original_table WHERE …;
サンプルプログラム
— 1. 構造のみの複製(インデックスもコピーされる)
— 本番テーブルと同じ構成の検証用テーブルを作成する際に使用します
CREATE TABLE users_backup_schema LIKE users;
— 2. データを含めた複製(インデックスはコピーされない点に注意)
— 特定の条件で切り出したデータセットを別テーブルにする際に使用します
CREATE TABLE users_tokyo_2023 AS
SELECT id, name, email
FROM users
WHERE region = ‘Tokyo’ AND created_at >= ‘2023-01-01’;
— 3. 実践的なテクニック:構造をコピーしてからデータを流し込む
— インデックスを保持したままデータをコピーしたい場合のベストプラクティス
CREATE TABLE users_clone LIKE users;
INSERT INTO users_clone SELECT FROM users WHERE status = ‘active’;
応用・注意点
現場で最も陥りやすい罠は、CREATE TABLE SELECTを使用した場合にインデックスが引き継がれないことです。
・インデックスの消失: SELECT文で作成したテーブルに対し、そのまま大量のデータを投入してクエリを実行すると、インデックスがないためにパフォーマンスが著しく低下します。作成後に必要に応じてALTER TABLEでインデックスを再作成してください。
・AUTO_INCREMENTの欠落: AUTO_INCREMENT属性も引き継がれないため、シーケンス番号を維持したい場合は別途設定が必要です。
・権限の確認: テーブル複製にはCREATE権限が必要です。運用環境では、ユーザー権限の設定を事前に確認しておきましょう。
安全かつ迅速なテーブル操作はDBAの基本スキルです。作業前には必ずバックアップを確認し、これらのコマンドを賢く使いこなしてください。

コメント