RENAME TABLE
tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2] ...
RENAME TABLE
は、1 つ以上のテーブルの名前を変更します。 元のテーブルに対する ALTER
権限と DROP
権限、および新しいテーブルに対する CREATE
権限と INSERT
権限が必要です。
たとえば、old_table
というテーブルの名前を new_table
に変更するには、次のステートメントを使用します:
RENAME TABLE old_table TO new_table;
このステートメントは、次の ALTER TABLE
ステートメントと同等です:
ALTER TABLE old_table RENAME new_table;
RENAME TABLE
は、ALTER TABLE
とは異なり、単一のステートメント内で複数のテーブルの名前を変更できます:
RENAME TABLE old_table1 TO new_table1,
old_table2 TO new_table2,
old_table3 TO new_table3;
名前変更操作は左から右に実行されます。 したがって、2 つのテーブル名を入れ替えるには、次の手順を実行します (仲介者名が tmp_table
のテーブルがまだ存在しないことを前提としています):
RENAME TABLE old_table TO tmp_table,
new_table TO old_table,
tmp_table TO new_table;
テーブルのメタデータロックは名前順に取得され、場合によっては、複数のトランザクションが同時に実行されるときに操作結果に違いが生じることがあります。 セクション8.11.4「メタデータのロック」を参照してください。
MySQL 8.0.13 では、WRITE
ロックでロックされているテーブル、または複数テーブルの名前変更操作の前のステップでロックされた WRITE
テーブルの名前を変更する積である場合、LOCK TABLES
ステートメントでロックされたテーブルの名前を変更できます。 たとえば、次のように指定できます:
LOCK TABLE old_table1 WRITE;
RENAME TABLE old_table1 TO new_table1,
new_table1 TO new_table2;
次の場合は許可されません。
LOCK TABLE old_table1 READ;
RENAME TABLE old_table1 TO new_table1,
new_table1 TO new_table2;
MySQL 8.0.13 より前は、RENAME TABLE
を実行するには、LOCK TABLES
でロックされたテーブルがないようにする必要があります。
トランザクションテーブルのロック条件が満たされると、名前変更操作はアトミックに実行されます。名前変更の進行中は、他のセッションはどのテーブルにもアクセスできません。
RENAME TABLE
中にエラーが発生した場合、ステートメントは失敗し、変更は行われません。
RENAME TABLE
を使用して、データベース間でテーブルを移動できます:
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
この方法を使用して、あるデータベースから別のデータベースにすべてのテーブルを移動すると、実際には、元のデータベースが引き続き存在し、テーブルなしでアルバイトされることを除き、データベースの名前が変更されます (MySQL に単一のステートメントがない操作)。
RENAME TABLE
と同様に、ALTER TABLE ... RENAME
を使用してテーブルを別のデータベースに移動することもできます。 使用するステートメントに関係なく、名前変更操作によってテーブルが別のファイルシステムにあるデータベースに移動される場合、結果の成功はプラットフォーム固有であり、テーブルファイルの移動に使用される基礎となるオペレーティングシステムコールによって異なります。
テーブルにトリガーがある場合、テーブルの名前を別のデータベースに変更しようとすると、「トリガーが間違ったスキーマにあります」 (ER_TRG_IN_WRONG_SCHEMA
) エラーで失敗します。
暗号化されていないテーブルは暗号化対応データベースに移動でき、その逆も可能です。 ただし、table_encryption_privilege_check
変数が有効になっている場合、テーブルの暗号化設定がデフォルトのデータベース暗号化と異なると、TABLE_ENCRYPTION_ADMIN
権限が必要です。
TEMPORARY
テーブルの名前を変更する場合、RENAME TABLE
は機能しません。 かわりに ALTER TABLE
を使用してください。
RENAME TABLE
はビューに対して機能しますが、ビューの名前を別のデータベースに変更することはできません。
名前を変更したテーブルまたはビュー専用に付与された権限は、新しい名前に移行されません。 それらは、手動で変更する必要があります。
RENAME TABLE
は、内部的に生成された外部キー制約名および文字列 「tbl_name
TO new_tbl_name
tbl_name
_ibfk_」で始まるユーザー定義の外部キー制約名を、新しいテーブル名を反映するように変更します。 InnoDB
は、文字列 「tbl_name
_ibfk_」で始まる外部キー制約名を内部的に生成された名前と解釈します。
名前が変更されたテーブルを指す外部キー制約名は、競合がないかぎり自動的に更新されます。競合がある場合、ステートメントはエラーで失敗します。 名前を変更した制約名がすでに存在する場合は、競合が発生します。 このような場合は、外部キーを削除して再作成し、正しく機能させる必要があります。
RENAME TABLE
は、新しいテーブル名を反映するために、文字列 「tbl_name
TO new_tbl_name
tbl_name
_chk_」で始まる内部生成およびユーザー定義の CHECK
制約名を変更します。 MySQL は、文字列 「tbl_name
_chk_」で始まる CHECK
制約名を内部的に生成された名前と解釈します。 例:
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`i1` int(11) DEFAULT NULL,
`i2` int(11) DEFAULT NULL,
CONSTRAINT `t1_chk_1` CHECK ((`i1` > 0)),
CONSTRAINT `t1_chk_2` CHECK ((`i2` < 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.02 sec)
mysql> RENAME TABLE t1 TO t3;
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`i1` int(11) DEFAULT NULL,
`i2` int(11) DEFAULT NULL,
CONSTRAINT `t3_chk_1` CHECK ((`i1` > 0)),
CONSTRAINT `t3_chk_2` CHECK ((`i2` < 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)