Bagaimana cara menukar tabel di MySQL?

51

Misalkan, saya punya tabel foo, yang berisi beberapa statistik yang dihitung setiap saat. Ini banyak digunakan oleh pertanyaan lain.

Itu sebabnya saya ingin menghitung lebih banyak statistik terkini foo_newdan menukarnya ketika perhitungan sudah siap.

Saya bisa melakukannya

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

tetapi apa yang terjadi jika permintaan membutuhkan tabel di fooantara dua baris ketika tidak ada tabel foo? Saya kira saya harus menguncinya entah bagaimana ... atau adakah cara lain untuk melakukannya?

Ben
sumber

Jawaban:

79

Gunakan perintah ini:

RENAME TABLE foo TO foo_old, foo_new To foo;

Ini adalah operasi atom: kedua tabel dikunci bersama (dan untuk waktu yang sangat singkat), sehingga akses apa pun terjadi baik sebelum atau sesudah RENAME.

Shlomi Noach
sumber
2
Satu masalah dengan ini adalah bahwa, Jika saya tableXpunya referensi induk yang punya referensi foo. Setelah RENAME ini, sekarang referensi, foo_oldtetapi jika tidak ada batasan referensi foomaka Anda harus baik-baik saja ...
Marcin Wasiluk
@MarcinWasiluk - satu lagi kelemahan untuk FOREIGN KEYs.
Rick James
2
Juga patut disadari bahwa RENAME TABLE harus menunggu pertanyaan yang ada di meja selesai sampai dapat dieksekusi. Itu akan baik-baik saja, tetapi itu juga mengunci pertanyaan lain sambil menunggu RENAME terjadi! Ini dapat menyebabkan penguncian serius tabel-tabel basis data Anda (ada untuk kami). Ini berlaku untuk innodb!
John Hunt