ฉันต้องการแทนที่เนื้อหาทั้งหมดของตารางโดยไม่กระทบกับSELECT
คำสั่งที่เข้ามาในระหว่างกระบวนการ
กรณีการใช้งานคือการมีตารางที่เก็บข้อมูลกล่องจดหมายที่แตกเป็นประจำและจะต้องเก็บไว้ในตาราง PostgreSQL มีไคลเอนต์จำนวนมากที่ใช้แอปพลิเคชันที่สืบค้นตารางเดียวกันตลอดเวลา
โดยปกติฉันจะทำสิ่งที่ชอบ (pseudocode ขาเข้า) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
แต่น่าเสียดายที่ตารางไม่สามารถอ่านได้ในระหว่างกระบวนการนี้ เนื่องจากเวลาที่ใช้INSERT INTO
ในการทำให้เสร็จสมบูรณ์ ตารางถูกล็อค
ใน MySQL ฉันจะใช้RENAME TABLE
คำสั่งatomic เพื่อหลีกเลี่ยงปัญหาเหล่านี้ ...
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;
ฉันจะบรรลุสิ่งนี้ใน PostgreSQL ได้อย่างไร
สำหรับวัตถุประสงค์ของคำถามนี้คุณสามารถสมมติว่าฉันไม่ได้ใช้กุญแจต่างประเทศ
TRUNCATE
คำสั่งจะรับการล็อก AccessExclusive บนโต๊ะดังนั้นจะไม่มีใครสามารถอ่านจากตารางได้จนกว่าธุรกรรมนั้นจะทำหรือย้อนกลับ
delete
แทนtruncate
มันจะช้าลง แต่ไม่มีการปิดกั้นผู้อ่าน คุณต้องลบกี่แถว
DELETE
และINSERT
จะนานเกินไป