Saya ingin mengganti seluruh isi tabel, tanpa memengaruhi SELECTpernyataan yang masuk selama proses.
Kasus penggunaan adalah memiliki tabel yang menyimpan informasi kotak surat yang diekstraksi secara teratur, dan perlu disimpan dalam tabel PostgreSQL. Ada banyak klien yang menggunakan aplikasi yang terus-menerus menanyakan tabel yang sama.
Biasanya, saya akan melakukan sesuatu seperti (pseudocode incoming) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Namun sayangnya tabel tidak dapat dibaca selama proses ini; karena waktu yang dibutuhkan INSERT INTOuntuk menyelesaikan. Meja dikunci.
Di MySQL, saya akan menggunakan RENAME TABLEperintah atom mereka untuk menghindari masalah ini ...
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;
Bagaimana saya bisa mencapai ini di PostgreSQL?
Untuk keperluan pertanyaan ini, Anda dapat menganggap saya tidak menggunakan kunci asing.
TRUNCATEperintah akan mendapatkan kunci AccessExclusive di atas meja, jadi tidak ada orang lain yang bisa membaca dari tabel sampai transaksi itu dilakukan atau dibatalkan.
deletebukannya truncateitu akan lebih lambat, tapi tanpa pembaca menghalangi. Berapa banyak baris yang perlu Anda hapus?
DELETEdan INSERTakan terlalu lama.