Re: Problem with n to n relation - Mailing list pgsql-sql

From Janning Vygen
Subject Re: Problem with n to n relation
Date
Msg-id 0110090942060D.30615@janning
Whole thread Raw
In response to Re: Problem with n to n relation  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Responses Re: Problem with n to n relation  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
List pgsql-sql
Am Montag,  8. Oktober 2001 19:33 schrieb Stephan Szabo:
> On Mon, 8 Oct 2001, Janning Vygen wrote:
> > Am Montag,  8. Oktober 2001 18:09 schrieb Stephan Szabo:
> > > On Mon, 8 Oct 2001, Janning Vygen wrote:
> > > > but how do i reach my goal. It should not be allowed to have
> > > > a person without any address??
> > >
> > > Hmm, do you always have at least one known address at the time
> > > you're inserting the person?
> > >
> > > I can think of a few somewhat complicated ways.  Person getting
> > > a column that references person2adress with initially deferred,
> > > the problem here is that you don't know one of the tables'
> > > serial values unless you're selecting it yourself which would
> > > mean you'd have to change how you were getting your
> > > incrementing numbers (getting currval of some sequence
> > > presumably and using that to insert into person2adress).
> >
> > yeah, thats a way which works. dont know if its cool to do it
> > like this, but you cant insert a person without any address. so
> > you are forced to use a transaction.
> >
> > create table person (
> >   id   serial,
> >   name text
> > );
> >
> > create table address (
> >   id     serial,
> >   street text NOT NULL
> > );
> >
> > create table person2address (
> >   id         int4,
> >   address_id int4 NOT NULL REFERENCES address (id),
> >   person_id  int4 NOT NULL REFERENCES person (id)
> > );
> >
> > ALTER TABLE person ADD CONSTRAINT person_has_adress FOREIGN KEY
> > (id) REFERENCES person2address(id) DEFERRABLE INITIALLY DEFERRED;
>
> This unfortunately will fail on 7.1 and higher due to the fact that
> a target of a foreign key constraint must have a unique constraint
> on it.  The problem is that if you make id effectively the same
> as person's id and unique you can't have two addresses for one
> person. I think you might need to do something like (untested and I
> think I got some syntax confused, but enough for the idea)

Yes you are right! It doesnt work. i thought i have tested it...

But i dont understand your solution. Why did you insert foo in the 
person table? Dou want to use it as a foreign key? Maybe you just 
mistyped your alter table statement i guess. you create a unique 
person2address id and references foo to it. So 'foo' will always 
refernce the first address inserted. Right? Ok thats a fine solution, 
but there is more work to do like a trigger when deleting this 
address... 

Is this the preferable solution?? I am wondering about tutorials 
never explaining stuff like that. Is it too uncommon to have a person 
with at least one address?

Janning

> create table person (
>  id serial,
>  name text,
>  foo int4
> );
>
> create table address(
>  id serial,
>  street text NOT NULL
> );
>
> create table person2address (
>   id         int4,
>   address_id int4 NOT NULL REFERENCES address (id),
>   person_id  int4 NOT NULL REFERENCES person (id)
> );
>
> create sequence person2address_seq;
>
> ALTER TABLE person ADD CONSTRAINT person_has_adress FOREIGN KEY
> (id) REFERENCES person2address(id) DEFERRABLE INITIALLY DEFERRED;




> begin;
>  select next_val('person2address_seq');
>  -- I'll refer to this as <val> below
>  insert into person (name, foo) values ('janning', <val>);
>  insert into address (street) values ('Sesamestreet');
>  insert into person2address values (<val>,
> currval('person_id_seq'), currval('address_id_seq')); commit;

-- 
Planwerk 6 /websolutions
Herzogstra�e 86
40215 D�sseldorf

fon 0211-6015919
fax 0211-6015917
http://www.planwerk6.de


pgsql-sql by date:

Previous
From: "Joe Conway"
Date:
Subject: Re: ROUND function ??
Next
From: Alexander Deruwe
Date:
Subject: Linking against null-fields.