Можно ли атомарно переименовать / заменить 2 или более таблиц и представлений? - PullRequest
1 голос
/ 29 ноября 2008

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

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

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

Ответы [ 3 ]

5 голосов
/ 29 ноября 2008

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

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

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

2 голосов
/ 09 февраля 2009

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

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

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

0 голосов
/ 18 марта 2016

Другие ответы неверны.

Можно переименовать несколько таблиц атомарно, перечислив несколько таблиц в операторе переименования.

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

...