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;
}
。任何人都可以提供任何指示?
答案 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
表格中唯一),则此仅可正常工作。
如果您无法保证,我不知道如何使用单个批量插入来实现这一目标。
请注意,我使用了不同于你问题的表名 - 我只是不喜欢那些引用的标识符