Как мне поменять местами таблицы в MySQL?

51

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

Вот почему я хочу вычислить более свежую статистику foo_newи поменять ее, когда вычисления будут готовы.

я мог бы сделать

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

но что произойдет, если запросу нужна таблица fooмежду этими двумя строками, когда таблицы нет foo? Я думаю, что я должен как-то заблокировать это ... или есть другой способ сделать это?

Бен
источник

Ответы:

79

Используйте эту команду:

RENAME TABLE foo TO foo_old, foo_new To foo;

Это атомарная операция: обе таблицы заблокированы вместе (и на очень короткое время), поэтому любой доступ происходит до или после RENAME.

Шломи Ноах
источник
2
Одна проблема с этим заключается в том, что, если у меня есть, tableXчто имеет родительское ограничение ссылки foo. После этого RENAME он будет теперь ссылаться, foo_oldно если нет никаких ссылок на ссылки, fooтогда вы должны быть в порядке ...
Marcin Wasiluk
@MarcinWasiluk - еще один недостаток FOREIGN KEYs.
Рик Джеймс
2
Также стоит помнить, что RENAME TABLE должен ждать завершения существующих запросов в таблице, пока она не будет выполнена. Это было бы хорошо, но также блокирует другие запросы в ожидании RENAME! Это может вызвать серьезную блокировку таблиц вашей базы данных (это имеет для нас). Это относится к innodb!
Джон Хант