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






Это тривиально в postgres и невозможно в mysql.
mysql исключает модификации схемы из транзакций. У меня есть опыт работы с postgres, так что это очевидная вещь (начать транзакцию, сделать что-то, зафиксировать или откатиться - postgres не разборчив в том, что такое «делать кое-что»).
Вы можете найти несколько ошибок в этом, если просмотрите базу ошибок mysql.
MySQL, как и Oracle, считает большинство операторов DDL (CREATE TABLE, ALTER TABLE и т.д.) вызывающими «неявную фиксацию». Вы не можете защитить другие соединения от просмотра изменений вашего DDL с помощью модели транзакции. (Я считаю, что Postgres в этом отношении необычен).
Возможно, вы сможете заблокировать таблицы, используя LOCK TABLES, но я подозреваю, что вы потеряете блокировку, как только переименуете таблицу! LOCK DATABASE может работать, но может потребовать, чтобы все другие клиенты полностью отключились, прежде чем ваш запрос блокировки будет предоставлен.
Это, конечно, приведет к блокировке других клиентов, пока вы переименовываете таблицы, что, вероятно, является недорогой операцией.
Остальные ответы неверны.
Вы можете переименовать несколько таблиц атомарно, указав несколько таблиц в операторе переименования.
См. Документацию здесь
Не знаю насчет ссылки - она просто делает то, что я ожидаю. AFAIK, единственное, что вы не можете откатить в postgres, - это усечение (т.е. вы удаляете и создаете может). Попробуйте и посмотрите, делает ли он то, что вы ожидаете.