Quiero reemplazar todo el contenido de una tabla, sin afectar las SELECT
declaraciones 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 INTO
completarlo. La mesa está cerrada.
En MySQL, habría usado su RENAME TABLE
comando 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.
TRUNCATE
comando 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.
delete
en su lugar truncate
será más lento, pero sin bloquear lectores. ¿Cuántas filas necesitas eliminar?
DELETE
y INSERT
sería demasiado largo.