Como eu troco tabelas no MySQL?

51

Suponha, eu tenho uma tabela foo, que contém algumas estatísticas que são calculadas de vez em quando. É muito usado por outras consultas.

É por isso que eu quero calcular estatísticas mais recentes foo_newe trocá-las quando a computação estiver pronta.

eu poderia fazer

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

mas o que acontece se uma consulta precisar de tabela fooentre essas duas linhas quando não houver tabela foo? Acho que tenho que trancá-lo de alguma forma ... ou existe outra maneira de fazê-lo?

Ben
fonte

Respostas:

79

Use este comando:

RENAME TABLE foo TO foo_old, foo_new To foo;

É uma operação atômica: as duas tabelas estão bloqueadas juntas (e por um período muito curto); portanto, qualquer acesso ocorre antes ou depois do RENAME.

Shlomi Noach
fonte
2
Um problema com isso é que, se eu tenho tableXisso, tenho referência de restrição de pai foo. Após este RENAME será agora referência foo_old, mas se não há restrições referenciando fooentão você deve estar OK ...
Marcin Wasiluk
@ MarcinWasiluk - mais uma desvantagem para FOREIGN KEYs.
21416 Rick
2
Também é importante estar ciente de que RENAME TABLE precisa aguardar que as consultas existentes na tabela sejam concluídas até que possam ser executadas. Isso seria bom, mas também bloqueia outras consultas enquanto aguarda RENAME acontecer! Isso pode causar um sério bloqueio de suas tabelas de banco de dados (que possui para nós). Isso se aplica ao innodb!
John Hunt