Saya ingin mengganti seluruh isi tabel, tanpa memengaruhi SELECT
pernyataan 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 INTO
untuk menyelesaikan. Meja dikunci.
Di MySQL, saya akan menggunakan RENAME TABLE
perintah 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.
TRUNCATE
perintah akan mendapatkan kunci AccessExclusive di atas meja, jadi tidak ada orang lain yang bisa membaca dari tabel sampai transaksi itu dilakukan atau dibatalkan.
delete
bukannya truncate
itu akan lebih lambat, tapi tanpa pembaca menghalangi. Berapa banyak baris yang perlu Anda hapus?
DELETE
dan INSERT
akan terlalu lama.