SELECTİşlem sırasında gelen ifadeleri etkilemeden bir tablonun tüm içeriğini değiştirmek istiyorum .
Kullanım durumu, düzenli olarak ayıklanan ve bir PostgreSQL tablosunda saklanması gereken posta kutusu bilgilerini depolayan bir tabloya sahip olmaktır. Sürekli aynı tabloyu sorgulayan bir uygulama kullanan birçok istemci var.
Normalde, (sözde kod gelen) gibi bir şey yapardım ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Ancak maalesef bu işlem sırasında tablo okunamıyor; INSERT INTOtamamlanması gereken zamandan dolayı . Masa kilitli.
RENAME TABLEMySQL'de bu sorunları önlemek için atomik komutlarını kullanırdım ...
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'de bunu nasıl başarabilirim?
Bu sorunun amaçları için yabancı anahtar kullanmadığımı varsayabilirsiniz.
TRUNCATEkomut, tabloda bir AccessExclusive kilidi alır, böylece bu işlem gerçekleşene veya geri alınana kadar başka kimse tablodan okuyamaz.
deleteBunun yerine kullanırsanız truncate, okuyucuları engellemeden daha yavaş olacaktır. Kaç satırı silmeniz gerekiyor?
DELETEve INSERTçok uzun olurdu.