ฉันจะสลับตารางใน MySQL ได้อย่างไร


51

สมมติว่าฉันมีตารางfooซึ่งมีสถิติบางอย่างที่คำนวณได้ทุกตอนแล้ว มันถูกใช้อย่างหนักโดยการสอบถามอื่น ๆ

นั่นเป็นเหตุผลที่ฉันต้องการคำนวณสถิติล่าสุดfoo_newและสลับเมื่อการคำนวณพร้อมใช้งาน

ฉันทำได้

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

แต่สิ่งที่เกิดขึ้นถ้าการสอบถามความต้องการของตารางfooinbetween ทั้งสองสายเมื่อมีโต๊ะไม่foo? ฉันเดาว่าฉันต้องล็อคมันไว้ ... หรือจะมีวิธีอื่นอีกไหม?

คำตอบ:


79

ใช้คำสั่งนี้:

RENAME TABLE foo TO foo_old, foo_new To foo;

มันเป็นงานอะตอม: ตารางทั้งสองจะถูกล็อคด้วยกัน (และเป็นเวลาที่สั้นมาก) ดังนั้นการเข้าถึงใด ๆ RENAMEเกิดขึ้นทั้งก่อนหรือหลัง



2
หนึ่งปัญหากับเรื่องนี้ก็คือว่าถ้าผมมีtableXที่ได้มีข้อ จำกัด fooปกครองอ้างอิง หลังจาก RENAME นี้จะมีการอ้างอิงfoo_oldแต่ถ้าไม่มีข้อ จำกัด ในการอ้างอิง fooคุณควรจะตกลง ...
Marcin Wasiluk

@MarcinWasiluk - FOREIGN KEYsยังเสียเปรียบอีกครั้งเพื่อให้
Rick James

2
นอกจากนี้ควรทราบว่า RENAME TABLE ต้องรอให้เคียวรีที่มีอยู่บนตารางเสร็จสิ้นจนกว่าจะสามารถดำเนินการได้ นั่นจะเป็นสิ่งที่ดี แต่ก็ยังล็อคการค้นหาอื่น ๆ ในขณะที่รอ RENAME ให้เกิดขึ้น! นี่อาจทำให้เกิดการล็อกตารางฐานข้อมูลของคุณอย่างร้ายแรง (มีสำหรับเรา) สิ่งนี้ใช้กับ innodb!
จอห์นฮันท์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.