| From: | "Albe Laurenz" <all(at)adv(dot)magwien(dot)gv(dot)at> | 
|---|---|
| To: | "Roland Walter *EXTERN*" <roland(dot)walter(dot)rwa(at)gmx(dot)net>, "Peter Neu" <peter(dot)neu(at)gmx(dot)net> | 
| Cc: | <pgsql-jdbc(at)postgresql(dot)org> | 
| Subject: | Re: Efficient Insert statement for one record into multiple | 
| Date: | 2006-12-18 14:36:50 | 
| Message-ID: | 52EF20B2E3209443BC37736D00C3C1380BF08073@EXADV1.host.magwien.gv.at | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-jdbc | 
>> I have this task that I need to insert one user record into to tables
A
>> and B.
>> 
>> So I'd like to do something like this
>> 
>> insert into A (user_name, value2 ) values ( "foo", "foo2")
>> 
>> AND
>> 
>> insert into B ( id_from_a , statistic_data) values ( 23, "bla")
>> 
>> How is this done the best way? I would like to do this in one call.
> 
> If you know the name of the sequence for the primary key in table A,
say
> "primary_A", then use the following to insert into table B direct
after
> you inserted into table A in the same connection:
> 
> insert into B (id_from_a, statistic_data) values(
currval("primary_A"),
> bla")
> 
> This works only if your insertion into table A called in some form
> nextval("primary_A"), may it be as default value or in the
> insertion-statement itself.
This is _bad_.
What if somebody did a nextval("primary_A") between the insert into A
and the insert into B?
If there is a sequence "primary_A" for table A, you should proceed
as follows:
- select nextval("primary_A")
- then insert into A with this primary key
- then insert into B with the same key
That should all be in a single transaction!
Yours,
Laurenz Albe
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Dave Cramer | 2006-12-18 14:50:13 | Re: Efficient Insert statement for one record into multiple | 
| Previous Message | Roland Walter | 2006-12-18 14:30:12 | Re: Efficient Insert statement for one record into multiple |