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

时间:2016-01-08 10:31:40

标签: postgresql sql-insert

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插入所有地址,然后以VALUES Contacts使用该ID数组,但我不知道如何使用public static TrequantApiInterface getClient(final String token) { if( sTreqantApiInterface == null) { Log.v(RETROFIT_LOG, "Creating api client for the first time"); OkHttpClient okClient = new OkHttpClient(); okClient.interceptors().add(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder = original.newBuilder() .header("Authorization", token) .method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }); Retrofit client = new Retrofit.Builder() .baseUrl(baseUrl) .client(okClient) .addConverterFactory(GsonConverterFactory.create()) .build(); sTreqantApiInterface = client.create(TrequantApiInterface.class); } return sTreqantApiInterface; } 。任何人都可以提供任何指示?

1 个答案:

答案 0 :(得分:4)

如果您插入的街道名称是唯一的,您可以执行以下操作:

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表格中唯一),则此可正常工作。

如果您无法保证,我不知道如何使用单个批量插入来实现这一目标。

请注意,我使用了不同于你问题的表名 - 我只是不喜欢那些引用的标识符