Как переименовать таблицу в SQL
ALTER TABLE products RENAME TO goods;Эта команда работает в SQLite, MySQL, MariaDB и PostgreSQL. Данные, индексы и ограничения остаются на месте — меняется только имя.
В разных СУБД
| СУБД | Команда |
|---|---|
| SQLite, PostgreSQL, MySQL | ALTER TABLE products RENAME TO goods; |
| MySQL, MariaDB | RENAME TABLE products TO goods; |
| Microsoft SQL Server | EXEC sp_rename 'products', 'goods'; |
RENAME TABLE в MySQL переименовывает несколько таблиц за раз, и это удобно, чтобы поменять две таблицы местами одной командой:
RENAME TABLE products TO products_old, products_new TO products;Что будет со ссылками
Внутри базы переименование почти всегда проходит гладко:
- Индексы и ограничения переезжают вместе с таблицей. Имена индексов не меняются: индекс
idx_products_nameтак и будет называться, хоть таблица теперьgoods. - Внешние ключи других таблиц продолжают указывать на эту таблицу и в SQLite, и в MySQL, и в PostgreSQL.
- Представления (VIEW) и триггеры. SQLite (начиная с версии 3.26) переписывает в них имя сама, PostgreSQL связывает их с таблицей не по имени, а по внутреннему номеру — они продолжают работать.
А вот всё, что записано текстом вне базы, придётся поправить самому: запросы в программах, отчёты, скрипты резервного копирования. После переименования старое имя даёт ошибку no such table: products в SQLite, Table 'shop.products' doesn't exist в MySQL и relation "products" does not exist в PostgreSQL.
Если таблицу читает работающий сайт или программа, переименование сломает их в ту же секунду. Обновите код и переименуйте таблицу одновременно — или временно создайте представление со старым именем: CREATE VIEW products AS SELECT * FROM goods;. В SQLite через такое представление можно только читать: INSERT в него закончится ошибкой cannot modify products because it is a view.
Переименовать столбец
ALTER TABLE goods RENAME COLUMN name TO title;Подробнее о столбцах — в справке Как добавить столбец.
Переименовать базу данных
- SQLite — база это файл: закройте все программы, которые с ним работают, и переименуйте файл как обычно.
- PostgreSQL —
ALTER DATABASE shop RENAME TO store;. К переименуемой базе в этот момент не должно быть подключений, поэтому выполняйте команду, подключившись к другой базе (например,postgres). - MySQL — команды переименования базы нет. Создайте новую базу и перенесите в неё таблицы:
RENAME TABLE shop.products TO store.products;для каждой таблицы, — или сделайте копию черезmysqldumpи восстановите её в новую базу (Резервная копия). Права пользователей на старую базу нужно выдать заново.
Перед переименованием базы или массовым переименованием таблиц сделайте резервную копию. Ошибка в имени посреди переноса оставит часть таблиц в одной базе, часть — в другой.