Re: Multiple inserts with two levels of foreign keys - Mailing list pgsql-general
From | Ron |
---|---|
Subject | Re: Multiple inserts with two levels of foreign keys |
Date | |
Msg-id | b1c119de-e395-4592-26f7-7f6f39b7658a@gmail.com Whole thread Raw |
In response to | Re: Multiple inserts with two levels of foreign keys (Dow Drake <dowdrake@gmail.com>) |
Responses |
Re: Multiple inserts with two levels of foreign keys
|
List | pgsql-general |
But honestly, the amount of text duplication hurts my "inner programmer". And it would have to be generated dynamically, since you don't know how many crops were delivered. #shudder On 10/5/23 09:33, Dow Drake wrote: > 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 > -- Born in Arizona, moved to Babylonia.
pgsql-general by date: