From: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
---|---|
To: | Janning Vygen <vygen(at)planwerk6(dot)de> |
Cc: | pgsql-sql(at)postgresql(dot)org |
Subject: | Re: Problem with n to n relation |
Date: | 2001-10-08 17:33:01 |
Message-ID: | Pine.BSF.4.21.0110081026500.78161-100000@megazone23.bigpanda.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
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)
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;
From | Date | Subject | |
---|---|---|---|
Next Message | Roberto Mello | 2001-10-08 18:09:34 | Re: SQL-Programmer tool and field%type support |
Previous Message | Janning Vygen | 2001-10-08 17:17:05 | Re: Problem with n to n relation |