codestory

Wie Drop ich alle Einschränkungen in einer Postgres-Datenbank?

  1. Drop Constraints

1. Drop Constraints

Vor einigen Jahren verwendete meine Webseite (o7planning.org) die Datenbank Oracle. Das ist eine gute Datenbank, aber sie ist zu umständlich und die Neuinstallation dauerte viel Zeit. Ich denke an einer neuen Datenbank um Oracle zu ersetzen und deshalb wird Postgres ausgewählt.
Mein damaliges Problem war, wie man Daten von Oracle nach Postgres konviertiert. Ich habe ein einfaches Tool geschrieben, um jede Tabelle in Oracle abzufragen (query) und in Tabelle Postgres einzufügen. Die Constrants auf Postgres müssen drop (fallen lassen) um eine erfolgreiche Dateneinfügung zu gewährleisten und sie werden dann neu erstellt.
Die folgende Abfrage hilft mir, das Skript dazu zu bringen, alle Constrants auf Postgres zu drop, das Ergebnis zu kopieren und in einer Datein zu speichern, z.B: 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
Führen Sie zum nächsten die folgende Abfrage aus, damit das Skript alle Constrants neu erstellt. Kopieren Sie das Ergebenis und speichern Sie es in einer Datei, z.B: 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;
Schließlich führe ich das Skript drop auf pgAdmin aus, oder führe die Datei drop_constrants.sql über Terminal aus.
sudo -u postgres psql

\o    /path/to/drop_constraints.sql