From: | Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com> |
---|---|
To: | "Glen W(dot) Mabey" <Glen(dot)Mabey(at)swri(dot)org> |
Cc: | postgresql-general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: deleting a foreign key that has no references |
Date: | 2007-03-19 16:46:22 |
Message-ID: | 20070319094105.U96428@megazone.bigpanda.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Mon, 19 Mar 2007, Glen W. Mabey wrote:
> Hello,
>
> I'm using 8.1.8, and I have a situation where a record in one table is
> only meaningful when it is referenced via foreign key by one or more
> records in any one of several tables.
>
> So, really what I want is when one of the referring records is deleted,
> to have a trigger check to see if it was the last one to use that
> foreign key, and if so, to delete that other record, too.
>
> My first implementation of this functionality was to write a trigger
> function that executed a COUNT(*) on all of the tables that could have a
> reference in them. That became way too slow for the number of records
> in these tables.
>
> Then, I tried to setting ON DELETE RESTRICT or NO ACTION on the foreign
> key constraint, and then trying to catch the exception thrown when a
> deletion attempt is made on the record. However, it seems that this
> PL/pgsql snippet fails to catch such an error:
>
> BEGIN EXCEPTION
> WHEN RAISE_EXCEPTION THEN
> RETURN NULL;
> WHEN OTHERS THEN
> RETURN NULL;
> END;
Was that the actual function you used or just a shortened version? A
function like that with a delete of the referenced table in the body for
the appropriate key appeared to have reasonable behavior on my 8.2 system
with an immediate constraint, but I didn't do very much testing. One issue
is that to test the insert of a row into the referenced table you'd
probably need to defer a check that the row is referenced in order to have
time to insert referencing rows.
> But, really, I just want to be able to test to see how many references
> there are to a key. Is there some way to do that?
Currently, not apart from selecting on the referencing table.
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2007-03-19 16:53:08 | Re: deleting a foreign key that has no references |
Previous Message | Jeff Davis | 2007-03-19 16:33:50 | Re: Possible planner bug? |