插入包含在同一查询中插入的 ID 的 VALUES 的多行

Insert multiple rows with VALUES containing IDs inserted in the same query

INSERT INTO "public"."Contacts"
  (FirstName, LastName, AddressId)
VALUES
 ('John', 'Doe',
  (INSERT INTO "public"."Addresses" (streetName) VALUES ('1st') RETURNING id)
 ),
  ('Jane', 'Doe',
   (INSERT INTO "public"."Addresses" (streetName) VALUES ('2nd') RETURNING id)
 )

我正在寻找一种在 VALUES 中使用多行插入显式值并将返回的 ID 作为这些值的一部分的方法。目前就查询而言,它不起作用,但如果它起作用,它将为每个地址创建一个单独的 INSERT

我知道我需要首先再次使用多个 VALUES 插入所有地址,然后以某种方式将该 ID 数组与 VALUES 一起用于 Contacts,但我不知道如何操作。谁能指点一下?

如果您插入的街道名称是唯一的,您可以这样做:

with new_data (firstname, lastname, streetname) as (
  values 
    ('John', 'Doe', '1st'),
    ('Jane', 'Doe', '2nd')
)
, new_addresses as (
  insert into addresses (streetname)
  select streetname
  from new_data
  returning id, streetname
)
insert into contacts (firstname, lastname, addressid)
select t.firstname, 
       t.lastname,
       a.id
from new_data t
  join new_addresses a on a.streetname = t.streetname;

再次说明:如果要插入的街道名称是唯一的(它们在 addresses table 中不需要唯一,则此 可以正常工作).

如果你不能保证这一点,我不知道你如何用一个 bulk-insert 做到这一点。


请注意,我使用的 table 名称与您在问题中使用的名称不同 - 我只是讨厌那些引用的标识符