Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在同一查询中插入包含ID的值的多行_Postgresql_Sql Insert - Fatal编程技术网

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;