devstory

Comment Drop toutes les contraintes sur une base de données Postgres?

1- Drop Constraints

Il y a quelques années, mon site web (o7planning.org) utilisait la base de données Oracle. Même si c'est une bonne base de données, elle était trop encombrante et la réinstallation prenait beaucoup de temps. J'ai donc réfléchi à la remplacer par une autre base de données, et Postgres a été choisi.
À l'époque, mon problème était de convertir les données d'Oracle vers Postgres. J'ai créé un outil simple permettant d'interroger chaque table dans Oracle et de l'insérer dans les tables Postgres. Les contraintes (constrants) dans Postgres doivent être supprimées (drop) aux fins de garantir une insertion réussie, elles seront recréées par la suite.
La requête suivante permet d'obtenir le scénario pour drop toutes les contraintes dans Postgres, copier le résultat et l'enregistrer dans un fichier quelconque, par exemple: drop_constraints.sql.
Generate Drop-Script
SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";'
FROM pg_constraint
INNER JOIN pg_class ON conrelid=pg_class.oid
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname
Ensuite, exécuter la requête suivante afin d'obtenir un scénario permettant de recréer toutes les contraintes. Copier le résultat et l'enregistrer dans un fichier quelconque, par exemple: recreate_constraints.sql.
Generate Recreate-Script
SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" ADD CONSTRAINT "'||conname||'" '||
   pg_get_constraintdef(pg_constraint.oid)||';'
FROM pg_constraint
INNER JOIN pg_class ON conrelid=pg_class.oid
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,
   contype DESC,nspname DESC,relname DESC,conname DESC;
Enfin, j'exécute le scénario drop dans pgAdmin, ou j'exécute le fichier drop_constrants.sql via Terminal.
sudo -u postgres psql

\o    /path/to/drop_constraints.sql