Comment permuter les tables dans MySQL?

51

Supposons que j'ai un tableau foocontenant des statistiques calculées de temps en temps. Il est fortement utilisé par d'autres requêtes.

C'est pourquoi je veux calculer des statistiques plus récentes foo_newet les échanger lorsque le calcul est prêt.

je pourrais faire

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

mais que se passe-t-il si une requête a besoin d'une table fooentre ces deux lignes lorsqu'il n'y a pas de table foo? Je suppose que je dois le verrouiller d'une manière ou d'une autre ... ou y a-t-il un autre moyen de le faire?

Ben
la source

Réponses:

79

Utilisez cette commande:

RENAME TABLE foo TO foo_old, foo_new To foo;

Il s’agit d’une opération atomique: les deux tables étant verrouillées ensemble (et pour une très courte période), tout accès a lieu avant ou après le RENAME.

Shlomi Noach
la source
2
Un problème avec ceci est que, si j’ai tableXce problème, il ya un référencement de la contrainte parentale foo. Après ce RENAME, ce sera le référencement foo_oldmais s'il n'y a pas de contraintes de référencement, tout foodevrait bien se
passer
@MarcinWasiluk - encore un autre inconvénient de FOREIGN KEYs.
Rick James
2
Il faut également savoir que RENAME TABLE doit attendre que les requêtes existantes sur la table se terminent avant de pouvoir être exécutées. Ce serait bien, mais cela verrouille également d'autres requêtes en attendant que RENAME se produise! Cela peut provoquer un blocage sérieux de vos tables de base de données (cela a pour nous). Cela s'applique à innodb!
John Hunt