Quiero reemplazar todo el contenido de una tabla, sin afectar las SELECTdeclaraciones entrantes durante el proceso.
El caso de uso es tener una tabla que almacene la información del buzón que se extrae regularmente y que debe almacenarse en una tabla PostgreSQL. Hay muchos clientes que usan una aplicación que consulta constantemente esa misma tabla.
Normalmente, haría algo como (pseudocódigo entrante) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Pero desafortunadamente la tabla no se puede leer durante este proceso; debido al tiempo que lleva INSERT INTOcompletarlo. La mesa está cerrada.
En MySQL, habría usado su RENAME TABLEcomando atómico para evitar estos problemas ...
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;
¿Cómo podría lograr esto en PostgreSQL?
A los fines de esta pregunta, puede suponer que no estoy usando claves foráneas.
TRUNCATEcomando adquirirá un bloqueo AccessExclusive en la tabla, por lo que nadie más podrá leer de la tabla hasta que esa transacción se confirme o se revierta.
deleteen su lugar truncateserá más lento, pero sin bloquear lectores. ¿Cuántas filas necesitas eliminar?
DELETEy INSERTsería demasiado largo.