Re: JDBC driver - is "getGeneratedKeys()" guaranteed to return the ids in the same order a batch insert was made?

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: electrotype <electrotype(at)gmail(dot)com>
Cc: "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: JDBC driver - is "getGeneratedKeys()" guaranteed to return the ids in the same order a batch insert was made?
Date: 2020-12-09 15:41:12
Message-ID: CAKFQuwZQV8eguy50d5kJ5r4MKduaJk4mWmFG5tsnZ11-ov=n-g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Dec 9, 2020 at 8:20 AM electrotype <electrotype(at)gmail(dot)com> wrote:

> So I'm curious. Why does order matter ?
>
> Dave Cramer
> www.postgres.rocks
>
>
> When you have to save multiple new entities with subentities.
>
> You first save all the parent entities in a single SQL batch insert, you
> get the generated ids, then insert all the subentities in another single
> SQL batch insert. To know which "parent id" to use for a given subentity of
> the second query, you need a way to associate a generated id with the
> correct parent entity. The order of the parents in their batch, and the
> order of the generated ids, is the only straighforward way.
>
> I know all this could be made into a single SQL query, without having to
> associate the generated ids to the parents manually. But sometimes you have
> to fight *really *hard agains your framework or JDBC itself to write such
> more complex query, where two batch inserts are very natural.
>
Agreed.

However, this isn't really the purview of JDBC - I'm doubting it does
anything that would cause the order to be different than what is received,
and the batch items are sent and results processed sequentially.

The main question is whether any batch items are inserting multiple records
themselves - i.e., RETURNING * is producing multiple results. Whatever
order RETURNING * produces is what the driver will capture - but it isn't
responsible for guaranteeing that the order of multiple inserted records
going in matches what comes out. PostgreSQL needs to make that claim. I
don't see where it does (i've sent an email to see if adding such a claim
to the documentation is proper). Done manually one can always do "WITH
insert returning SELECT ORDER BY", but it doesn't seem workable for the
driver to try and do that when adding the returning clause, which I presume
is what is in scope here.

David J.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Wolfgang Walther 2020-12-09 16:37:47 Re: Execution order of CTEs / set_config and current_setting in the same query
Previous Message Dave Cramer 2020-12-09 15:39:06 Re: JDBC driver - is "getGeneratedKeys()" guaranteed to return the ids in the same order a batch insert was made?