MySQL 8.0 リファレンスマニュアル


13.1.36 RENAME TABLE ステートメント

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)

関連キーワード:  ステートメント, TABLE, CREATE, テーブル, RENAME, 変更, 名前, DROP, new, 制約