Jak zamienić tabele w MySQL?

51

Załóżmy, że mam tabelę foo, która zawiera pewne statystyki, które są obliczane co jakiś czas. Jest intensywnie wykorzystywany przez inne zapytania.

Dlatego chcę obliczyć najnowsze statystyki foo_newi zamienić je, gdy obliczenia będą gotowe.

mógłbym zrobić

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

ale co się stanie, jeśli zapytanie potrzebuje tabeli foomiędzy tymi dwoma wierszami, gdy nie ma tabeli foo? Chyba muszę to jakoś zablokować ... czy jest inny sposób?

Ben
źródło

Odpowiedzi:

79

Użyj tego jednego polecenia:

RENAME TABLE foo TO foo_old, foo_new To foo;

Jest to operacja atomowa: obie tabele są zablokowane razem (i przez bardzo krótki czas), więc każdy dostęp występuje przed lub po RENAME.

Shlomi Noach
źródło
2
Jednym z problemów jest to, że jeśli mam, tableXże istnieje odwołanie do ograniczenia rodzica foo. Po tej zmianie nazwy będzie się teraz pojawiać odniesienie, foo_oldale jeśli nie ma żadnych ograniczeń foo, powinieneś być OK ...
Marcin Wasiluk,
@MarcinWasiluk - kolejna wada FOREIGN KEYs.
Rick James
2
Warto również pamiętać, że RENAME TABLE musi czekać na zakończenie istniejących zapytań w tabeli, aż będzie można je wykonać. To by było w porządku, ale blokuje również inne zapytania podczas oczekiwania na RENAME! Może to spowodować poważne zablokowanie tabel bazy danych (ma to dla nas). Dotyczy to innodb!
John Hunt,