Re: Lost in Foreign Key land - Mailing list pgsql-general

From David Fetter
Subject Re: Lost in Foreign Key land
Date
Msg-id 20050410192345.GB3419@fetter.org
Whole thread Raw
In response to Lost in Foreign Key land  (Benjamin Smith <lists@benjamindsmith.com>)
List pgsql-general
On Sat, Apr 09, 2005 at 03:41:55PM -0700, Benjamin Smith wrote:
> Ok, I have a stupid-simple table:

> create table files (
>  id serial unique not null,
>  mime varchar not null,
>  name varchar not null
>  );

BTW, the hip kids use TEXT instead of VARCHAR :)

> Idea being that I can save values from a file upload into a table,
> and use throughout my application.  This gives me a central
> repository to look for files of a particular name, etc. while
> allowing multiple files with the same name to be uploaded.  It might
> be used something like this:

> create table personalinfo (
>  name varchar,
>  address varchar,
>  resume integer not null references files(id)
>  );

> But, I want to keep it "clean" - meaning that if the file orphaned,
> (isn't used anywhere), I want to delete it.  I asked a related
> question a few months ago, and never understood the responses. (See
> thread "Search for restricting foreign keys") I just spent the last
> few hours trying to make sense of Forian Plug's query from an email
> dated 1/25/05 and reading up on the attribute tables, and I am lost.

OK, here's what you could do.  For each table (like personalinfo) you
have a trigger on INSERT OR UPDATE OR DELETE

1.  Create a file_fk_ref table, which contains two columns: a
file_id and a counter.

You can either put a trigger which causes a DELETE on the files table
for each row when its count reaches zero, or you could check regularly
for zero'd file_ids and delete them batchwise.

2.  Create triggers on each of the referencing tables (personalinfo,
etc.) which SELECT the appropriate rows in file_fk_ref FOR UPDATE,
then do the following for each row:

* ON INSERT, increment the counter for the file_id in file_fk_ref.
* ON UPDATE, check whether an increment & corresponding decrement are
  required on the file_fk_ref table.
* ON DELETE, decrement the counter for the file_id in the file_fk_ref
  table.

HTH :)

Cheers,
D
--
David Fetter david@fetter.org http://fetter.org/
phone: +1 510 893 6100   mobile: +1 415 235 3778

Remember to vote!

pgsql-general by date:

Previous
From: Florin Andrei
Date:
Subject: grant all privileges to all tables in a database
Next
From: John DeSoi
Date:
Subject: Re: grant all privileges to all tables in a database