Je souhaite remplacer l'intégralité du contenu d'une table, sans affecter les SELECT
instructions entrantes au cours du processus.
Le cas d'utilisation est d'avoir une table qui stocke des informations de boîte aux lettres qui sont régulièrement extraites et doit être stockée dans une table PostgreSQL. De nombreux clients utilisent une application qui interroge constamment cette même table.
Normalement, je ferais quelque chose comme (pseudocode entrant) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Mais malheureusement, le tableau ne peut pas être lu pendant ce processus; en raison du temps qu'il faut INSERT INTO
pour terminer. La table est verrouillée.
Dans MySQL, j'aurais utilisé leur RENAME TABLE
commande atomique pour éviter ces problèmes ...
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;
Comment pourrais-je y parvenir dans PostgreSQL?
Aux fins de cette question, vous pouvez supposer que je n'utilise pas de clés étrangères.
TRUNCATE
commande va acquérir un verrou AccessExclusive sur la table, donc personne d'autre ne pourra lire à partir de la table jusqu'à ce que cette transaction soit validée ou annulée.
delete
place, truncate
il sera plus lent, mais sans bloquer les lecteurs. Combien de lignes devez-vous supprimer?
DELETE
et INSERT
serait bien trop long.