Re: Multiple inserts with two levels of foreign keys - Mailing list pgsql-general

From Dow Drake
Subject Re: Multiple inserts with two levels of foreign keys
Date
Msg-id C50FF2D7-8114-4656-8027-D07D48524DC7@gmail.com
Whole thread Raw
In response to Re: Multiple inserts with two levels of foreign keys  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
Responses Re: Multiple inserts with two levels of foreign keys
List pgsql-general
Yes!  Thanks, Alvaro!  This is exactly the pattern I was trying to work out!  This community is awesome!

> On Oct 5, 2023, at 2:39 AM, Alvaro Herrera <alvherre@alvh.no-ip.org> wrote:
>
> On 2023-Oct-04, Dow Drake wrote:
>
>> I want to insert a farm record, then insert two crops associated with that
>> farm, then insert two deliveries for each of the the two crops so that in
>> the end, my tables look like this:
>
> If I understand you correctly, for each table you want one CTE with the
> data you want to insert, and another CTE with the data actually
> inserted, that can be matched later.  Something like this should work:
>
> with newfarms (name) as (values ('Happy Valley Farm')),
>     insertedfarms (id, name) as (insert into farms (name)
>                                         select newfarms.name
>                                           from newfarms
>                                      returning id, name),
>     newcrops (farm, name) as (values ('Happy Valley Farm', 'corn'),
>                                      ('Happy Valley Farm', 'wheat')),
>     insertedcrops as (insert into crops (farm_id, name)
>                              select (select insertedfarms.id
>                                        from insertedfarms
>                                       where insertedfarms.name = newcrops.farm),
>                                     newcrops.name
>                                from newcrops
>                           returning id, farm_id, name),
>     newdeliveries (farm, name, ticket) as (values ('Happy Valley Farm', 'corn', '3124'),
>                                                   ('Happy Valley Farm', 'wheat', '3127'),
>                                                   ('Happy Valley Farm', 'corn', '3133'),
>                                                   ('Happy Valley Farm', 'wheat', '3140')),
>     inserteddeliveries as (insert into deliveries (crop_id, ticket)
>                                   select (select ics.id
>                                             from insertedfarms ifs join insertedcrops ics on (ifs.id = ics.farm_id)
>                                            where ifs.name = newdeliveries.farm and
>                                                  ics.name = newdeliveries.name),
>                                          ticket
>                                     from newdeliveries
>                                returning *)
> select * from inserteddeliveries;
>
>
> --
> Álvaro Herrera               48°01'N 7°57'E  —  https://www.EnterpriseDB.com/
> Are you not unsure you want to delete Firefox?
>       [Not unsure]     [Not not unsure]    [Cancel]
>                   http://smylers.hates-software.com/2008/01/03/566e45b2.html



pgsql-general by date:

Previous
From: Lauri Kajan
Date:
Subject: Re: Index scan is not pushed down to union all subquery
Next
From: jacktby jacktby
Date:
Subject: How to make a map in pg kernel?