Search Postgresql Archives

Re: Lost in Foreign Key land

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx http://fetter.org/
phone: +1 510 893 6100   mobile: +1 415 235 3778

Remember to vote!

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux