Spec-Zone.ru › MySQL 8.4

15.1.36 Оператор RENAME TABLE

RENAME TABLE
    tbl_name TO new_tbl_name
    [, tbl_name2 TO new_tbl_name2] ...

RENAME TABLE переименовывает одну или несколько таблиц. Для исходной таблицы необходимо иметь 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;

Операции переименования выполняются слева направо. Таким образом, чтобы поменять местами два имени таблиц, сделайте следующее (предполагая, что таблица с промежуточным именем tmp_table ещё не существует):

RENAME TABLE old_table TO tmp_table,
             new_table TO old_table,
             tmp_table TO new_table;

Блокировки метаданных для таблиц приобретаются в порядке имен, что в некоторых случаях может повлиять на результат операции при одновременном выполнении нескольких транзакций. Смотрите Раздел 10.11.4, «Блокировка метаданных».

Вы можете переименовать таблицы, заблокированные оператором LOCK TABLES, при условии, что они заблокированы с помощью WRITE блокировки или являются результатом переименования таблиц с блокировкой WRITE в предыдущих шагах операции переименования нескольких таблиц. Например, это разрешено:

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;

При выполнении условий блокировки транзакций для таблиц операция переименования выполняется атомарно; ни одна другая сессия не может получить доступ к каким-либо из таблиц во время выполнения переименования.

Если во время операции RENAME TABLE возникнут ошибки, оператор завершается неудачно, и изменения не вносятся.

Вы можете использовать RENAME TABLE, чтобы переместить таблицу из одной базы данных в другую:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

Использование этого метода для перемещения всех таблиц из одной базы данных в другую фактически переименовывает базу данных (операции, для которой у MySQL нет отдельного оператора), за исключением того, что исходная база данных продолжает существовать, хотя и без таблиц.

Как и RENAME TABLE, ALTER TABLE ... RENAME также может использоваться для перемещения таблицы в другую базу данных. Независимо от используемого оператора, если операция переименования переместит таблицу в базу данных, расположенную на другой файловой системе, успех результата зависит от платформы и используемых подлежащих вызовов операционной системы для перемещения файлов таблиц.

Если у таблицы есть триггеры, попытки переименования таблицы в другую базу данных завершатся ошибкой Триггер в неправильной схеме ().

Расшифрованная таблица может быть перемещена в базу данных с включённым шифрованием и наоборот. Однако, если переменная 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 изменяет имена ограничений CHECK, сгенерированные внутри и определённые пользователем, начинающиеся со строки “tbl_name_chk_”, чтобы отразить новое имя таблицы. MySQL интерпретирует имена ограничений CHECK, начинающиеся со строки “tbl_name_chk_”, как сгенерированные внутри имена. Пример:

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)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/rename-table.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API