Могу ли я атомарно переименовать / заменить 2 или более таблиц и представлений?

Учитывая таблицу X и представление Y (которое имеет ту же структуру, что и X), есть ли способ атомарно переименовать X в Z и Y в X, чтобы ни один запрос никогда не увидел ничего с именем X? Также можно переименовать X и создать представление.

Смысл в том, чтобы в рамках плана миграции схемы заменить старые таблицы представлениями, имитирующими старую версию из новой версии, чтобы оба набора клиентского кода могли работать одновременно.

MySQL - мой выбор, но информация о других тоже будет полезна.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
1 062
3

Ответы 3

Это тривиально в postgres и невозможно в mysql.

mysql исключает модификации схемы из транзакций. У меня есть опыт работы с postgres, так что это очевидная вещь (начать транзакцию, сделать что-то, зафиксировать или откатиться - postgres не разборчив в том, что такое «делать кое-что»).

Вы можете найти несколько ошибок в этом, если просмотрите базу ошибок mysql.

Не знаю насчет ссылки - она ​​просто делает то, что я ожидаю. AFAIK, единственное, что вы не можете откатить в postgres, - это усечение (т.е. вы удаляете и создаете может). Попробуйте и посмотрите, делает ли он то, что вы ожидаете.

Dustin 29.11.2008 03:42

MySQL, как и Oracle, считает большинство операторов DDL (CREATE TABLE, ALTER TABLE и т.д.) вызывающими «неявную фиксацию». Вы не можете защитить другие соединения от просмотра изменений вашего DDL с помощью модели транзакции. (Я считаю, что Postgres в этом отношении необычен).

Возможно, вы сможете заблокировать таблицы, используя LOCK TABLES, но я подозреваю, что вы потеряете блокировку, как только переименуете таблицу! LOCK DATABASE может работать, но может потребовать, чтобы все другие клиенты полностью отключились, прежде чем ваш запрос блокировки будет предоставлен.

Это, конечно, приведет к блокировке других клиентов, пока вы переименовываете таблицы, что, вероятно, является недорогой операцией.

Остальные ответы неверны.

Вы можете переименовать несколько таблиц атомарно, указав несколько таблиц в операторе переименования.

См. Документацию здесь

Другие вопросы по теме