Généralement, le moyen le plus rapide de dupliquer une table est simplement:
CREATE TABLE table2 AS SELECT * FROM table1;
Les INSERT parallèles peuvent être plus rapides, mais uniquement avec un sous-système de disque très rapide (lorsque les données sont entrelacées sur de nombreux lecteurs). Sinon, ce sera plus lent.
Une fois la modification terminée table2
, il peut prendre le nouveau nom avec:
BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
La DROP TABLE
commande a besoin d'un verrou exclusif, qui affecte les lecteurs simultanés d'une manière que vous souhaiterez peut-être anticiper:
DROP
attendra la fin de toute lecture en attente sur la table des autres transactions.
- Toute nouvelle transaction tentant de lire cette table entre-temps sera mise en attente, puis échouera car l'original
table1
n'existe plus. L'erreur ressemblerait « pourrait relation ouverte avec pas OID oid »
Pour éviter le deuxième problème, vous pouvez renommer table1
au old_table1
lieu de le supprimer, puis le supprimer uniquement plus tard en dehors de la transaction, lorsque ces lecteurs en auront terminé. Ainsi, la séquence ci-dessus deviendrait:
BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;