Làm cách nào để trao đổi bảng trong MySQL?


51

Giả sử, tôi có một bảng foochứa một số thống kê được tính toán mọi lúc. Nó được sử dụng nhiều bởi các truy vấn khác.

Đó là lý do tại sao tôi muốn tính toán số liệu thống kê gần đây hơn foo_newvà trao đổi chúng khi tính toán đã sẵn sàng.

tôi có thể làm

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

Nhưng điều gì xảy ra nếu một truy vấn cần bảng nằm foogiữa hai dòng đó khi không có bảng foo? Tôi đoán tôi phải khóa nó bằng cách nào đó ... hoặc có cách nào khác để làm điều đó?

Câu trả lời:


79

Sử dụng lệnh này:

RENAME TABLE foo TO foo_old, foo_new To foo;

Đây là một hoạt động nguyên tử: cả hai bảng được khóa cùng nhau (và trong một thời gian rất ngắn), vì vậy mọi truy cập xảy ra trước hoặc sau RENAME.



2
Một vấn đề với điều này là, nếu tôi có tableXđiều đó có tham chiếu ràng buộc cha mẹ foo. Sau RENAME này, bây giờ nó sẽ được tham chiếu foo_oldnhưng nếu không có ràng buộc nào tham chiếu foothì bạn sẽ ổn thôi ...
Marcin Wasiluk

@MarcinWasiluk - một nhược điểm khác FOREIGN KEYs.
Rick James

2
Cũng đáng lưu ý rằng RENAME TABLE phải chờ các truy vấn hiện có trên bảng kết thúc cho đến khi có thể được thực thi. Điều đó sẽ ổn, nhưng nó cũng khóa các truy vấn khác trong khi chờ RENAME xảy ra! Điều này có thể gây ra sự khóa nghiêm trọng các bảng cơ sở dữ liệu của bạn (nó có cho chúng tôi). Điều này áp dụng cho innodb!
John Hunt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.