Tôi muốn thay thế toàn bộ nội dung của một bảng, mà không ảnh hưởng đến bất kỳ SELECT
câu lệnh đến nào trong quá trình.
Trường hợp sử dụng là có một bảng lưu trữ thông tin hộp thư thường xuyên được trích xuất và cần được lưu trữ trong bảng PostgreQuery. Có nhiều khách hàng sử dụng một ứng dụng liên tục truy vấn cùng một bảng.
Thông thường, tôi sẽ làm một cái gì đó như (mã giả đến) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Nhưng thật không may, bảng không thể được đọc trong quá trình này; do thời gian cần thiết INSERT INTO
để hoàn thành. Bàn bị khóa.
Trong MySQL, tôi đã sử dụng RENAME TABLE
lệnh nguyên tử của họ để tránh những vấn đề này ...
CREATE TABLE table_new LIKE table;
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
Làm thế nào tôi có thể đạt được điều này trong PostgreSQL?
Đối với mục đích của câu hỏi này, bạn có thể cho rằng tôi không sử dụng khóa ngoại.
TRUNCATE
lệnh sẽ có được khóa AccessExinating trên bảng, do đó, không ai khác có thể đọc từ bảng cho đến khi giao dịch đó được thực hiện hoặc được khôi phục.
delete
thay vì truncate
nó sẽ chậm hơn, nhưng không chặn độc giả. Bạn cần xóa bao nhiêu hàng?
DELETE
và INSERT
sẽ là quá lâu.