Wie tausche ich Tabellen in MySQL aus?

51

Angenommen, ich habe eine Tabelle foo, die einige Statistiken enthält, die hin und wieder berechnet werden. Es wird häufig von anderen Abfragen verwendet.

Aus diesem Grund möchte ich neuere Statistiken berechnen foo_newund austauschen, wenn die Berechnung abgeschlossen ist.

ich könnte

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

aber was passiert, wenn eine Abfrage eine Tabelle foozwischen diesen beiden Zeilen benötigt, wenn keine Tabelle vorhanden ist foo? Ich denke, ich muss es irgendwie sperren ... oder gibt es eine andere Möglichkeit, das zu tun?

Ben
quelle

Antworten:

79

Verwenden Sie diesen einen Befehl:

RENAME TABLE foo TO foo_old, foo_new To foo;

Es ist eine atomare Operation: Beide Tabellen sind miteinander (und für eine sehr kurze Zeit) gesperrt, sodass jeder Zugriff entweder vor oder nach dem erfolgt RENAME.

Shlomi Noach
quelle
2
Ein Problem dabei ist, dass, wenn ich das habe tableX, Elternbeschränkungsreferenzierung hat foo. Nach diesem RENAME wird es jetzt referenzieren, foo_oldaber wenn es keine referenzierenden Einschränkungen foogibt, sollten Sie OK sein ...
Marcin Wasiluk
@MarcinWasiluk - noch ein Nachteil FOREIGN KEYs.
Rick James
2
Beachten Sie auch, dass RENAME TABLE warten muss, bis vorhandene Abfragen in der Tabelle abgeschlossen sind, bis sie ausgeführt werden können. Das wäre in Ordnung, aber es sperrt auch andere Abfragen, während darauf gewartet wird, dass RENAME ausgeführt wird! Dies kann zu einer ernsthaften Sperrung Ihrer Datenbanktabellen führen (was für uns der Fall ist). Das gilt für innodb!
John Hunt