Postgresql 在同一查询中插入包含ID的值的多行
我正在寻找一种方法,使用Postgresql 在同一查询中插入包含ID的值的多行,postgresql,sql-insert,Postgresql,Sql Insert,我正在寻找一种方法,使用values中的多行插入显式值,并将返回的ID作为这些值的一部分。目前,该查询不起作用,但如果它起作用,它将为每个地址分别创建一个INSERT 我知道我需要首先再次使用多个值插入所有地址,然后以某种方式将该ID数组与值一起用于联系人,但我不知道如何使用。任何人都可以提供任何指针?如果插入的街道名称是唯一的,您可以执行以下操作: INSERT INTO "public"."Contacts" (FirstName, LastName, AddressId) VALUES
values
中的多行插入显式值,并将返回的ID作为这些值的一部分。目前,该查询不起作用,但如果它起作用,它将为每个地址分别创建一个INSERT
我知道我需要首先再次使用多个
值插入所有地址,然后以某种方式将该ID数组与值一起用于联系人
,但我不知道如何使用。任何人都可以提供任何指针?如果插入的街道名称是唯一的,您可以执行以下操作:
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)
)
再次说明:如果要插入的街道名称是唯一的(它们在地址表中不需要是唯一的),则此仅能正确工作
如果您不能保证这一点,我不知道如何使用单个批量插入来实现这一点
请注意,我使用的表名与您在问题中使用的不同-我只是不喜欢那些引用的标识符您应该真正避免那些可怕的引用标识符。我个人会创建一个存储的prcoedure来处理这两个插入。我不知道引用的标识符有什么问题,因为我只是刚刚在用Postres做任何工作,但是你的帖子回答了我的问题,所以谢谢。)@汤姆·亚什·胡贝尔鲍尔:它们没有什么“错误”,但我发现它们更难打字和阅读。但它们也带来了非引号标识符可能没有的问题。e、 g.“联系人”
与联系人的名称不同。有时工具、框架或库只是没有准备好正确处理它们。从长远来看,它们只会产生一些小而烦人的问题,如果你不引用它们,你就不会有这些问题。我明白了!感谢你澄清了这一点,我肯定会坚持最佳实践,鉴于你列出的理由,避免使用它们似乎是合理的。
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;