¿Cómo cambio tablas en MySQL?


51

Supongamos que tengo una tabla fooque contiene algunas estadísticas que se calculan de vez en cuando. Es muy utilizado por otras consultas.

Es por eso que quiero calcular estadísticas más recientes foo_newe intercambiarlas cuando el cálculo esté listo.

Yo podría hacer

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

pero, ¿qué sucede si una consulta necesita una tabla fooentre esas dos líneas cuando no hay una tabla foo? Supongo que tengo que bloquearlo de alguna manera ... ¿o hay otra forma de hacerlo?

Respuestas:


79

Use este comando:

RENAME TABLE foo TO foo_old, foo_new To foo;

Es una operación atómica: ambas tablas están bloqueadas juntas (y por un tiempo muy corto), por lo que cualquier acceso se produce antes o después del RENAME.



2
Un problema con esto es que, si lo tengo, tableXtengo referencia de restricción principal foo. Después de este RENAME, ahora se hará referencia, foo_oldpero si no hay restricciones, fooentonces debería estar bien ...
Marcin Wasiluk

@MarcinWasiluk: otro inconveniente más FOREIGN KEYs.
Rick James

2
También vale la pena tener en cuenta que RENAME TABLE tiene que esperar a que finalicen las consultas existentes en la tabla hasta que pueda ejecutarse. Eso estaría bien, ¡pero también bloquea otras consultas mientras espera que RENAME ocurra! Esto puede causar un bloqueo grave de las tablas de su base de datos (lo tiene para nosotros). Esto se aplica a innodb!
John Hunt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.