betacode

Как мне снять все ограничения в базе данных Postgres?

  1. Drop Constraints

1. Drop Constraints

Несколько лет назад для своего сайта (o7planning.org) я использовал базу данных Oracle. Хотя это хорошая база данных, она слишком громоздка и её переустановка требует очень много времени. Поэтому я выбрал базу данных Postgres для замены Oracle.
В то время моя проблема заключалась в том, чтобы переносить данные из Oracle в Postgres. Я создал простой инструмент, выполняющий запрос каждой таблицы в Oracle и вставляющий её в таблицы Postgres. Ограничения (constrants) на Postgres должны быть drop (сняты) для обеспечения успешной вставки данных, и они будут воссозданы.
Приведенный нижезапрос позволяет заставить скрипт drop (отбросить) все ограничения на Postgres, скопируйте полученный результат и сохраните его в файле, например 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
Затем выполните следующий запрос, чтобы заставить скрипт воссоздать все ограничения. Скопируйте полученный результат и сохраните его в файле, например 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;
Наконец, выполните скрипт drop на pgAdmin или drop_constrants.sql через Terminal.
sudo -u postgres psql

\o    /path/to/drop_constraints.sql