Re: deferring ForeignKey checks when you didn't set a deferrable constraint ?

From: Melvin Davidson <melvin6925(at)gmail(dot)com>
To: Jonathan Vanasco <postgres(at)2xlp(dot)com>
Cc: PostgreSQL General <pgsql-general(at)postgresql(dot)org>
Subject: Re: deferring ForeignKey checks when you didn't set a deferrable constraint ?
Date: 2014-11-20 23:00:05
Message-ID: CANu8Fixu0-Nw5PvfjiXvgHpgSTuBBSphVBr4-uth+tpBk8PwSw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Try the following queries. It will give you two .sql files
(create_fkeys.sql & drop_fkeys.sql).

First review them to make sure they look ok.
Then execute the drop_fkeys.sql
ie: \i drop_fkeys.sql

Do your deletes, then rebuild your fk's with
\i create_fkeys.sql

Good luck.

==========================================================
-- CREATE STATEMENT FOR ALL FK's

\o create_fkeys.sql

SELECT E'\\timing';

SELECT 'ALTER TABLE ' || n.nspname || '.' || '"' || t.relname || '"'
|| ' ADD CONSTRAINT ' || '"' || c.conname || '"'
|| ' '
|| pg_get_constraintdef( c.oid)
|| ';'
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
JOIN pg_class f ON (f.oid = c.confrelid)
WHERE c.contype = 'f'
AND t.relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY n.nspname,
t.relname;

-- DROP FK's

\o drop_fkeys.sql

SELECT E'\\timing';

SELECT 'ALTER TABLE ' || n.nspname || '.' || '"' || t.relname || '"'
|| ' DROP CONSTRAINT ' || '"' || c.conname || '"' || ' CASCADE;'
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
JOIN pg_class f ON (f.oid = c.confrelid)
WHERE c.contype = 'f'
AND t.relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY 1;

On Thu, Nov 20, 2014 at 5:13 PM, Jonathan Vanasco <postgres(at)2xlp(dot)com> wrote:

>
> I have a core table with tens-of-millions of rows, and need to delete
> about a million records.
>
> There are 21 foreign key checks against this table. Based on the current
> performance, it would take a few days to make my deletions.
>
> None of the constraints were defined as `DEFERRABLE INITIALLY IMMEDIATE',
> so I'm out of luck on deferring them.
>
> Dropping/redefining constraints looks to be an ordeal -- and something
> I'm scared to make a mistake on.
>
> i looked into disabling triggers on a table, but I couldn't find any info
> on how to trigger at the end of the transaction so I can ensure integrity.
>
> does anyone have suggestions on things that might work?
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

--
*Melvin Davidson*
I reserve the right to fantasize. Whether or not you
wish to share my fantasy is entirely up to you.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message zach cruise 2014-11-21 00:57:05 Re: better architecture?
Previous Message Jonathan Vanasco 2014-11-20 22:13:19 deferring ForeignKey checks when you didn't set a deferrable constraint ?