maria-discuss team mailing list archive
-
maria-discuss team
-
Mailing list archive
-
Message #03895
Re: When using the getGeneratedKeys() method the keys are returned, but in which order?
It further depends on auto increment lock mode. You can have a big gap between "buckets" of id values in the non-default mode, if the bulk insert is large and uses more than one "bucket" of values.
Sent from my iPhone
> On Aug 26, 2016, at 12:46 PM, Justin Swanhart <greenlion@xxxxxxxxx> wrote:
>
> Generated id values are not guaranteed to be sequential. The auto_increment lock is shared by transactions. This code will not always work.
>
> Sent from my iPhone
>
>> On Aug 26, 2016, at 12:33 PM, Diego Dupin <diego.dupin@xxxxxxxxxxx> wrote:
>>
>> Hi peter,
>>
>> Basically, server will return different informations to driver. In those informations, there is a "last insert id" that correspond to the first created id of the query, and the number of affected rows.
>> So for example :
>> try (Statement stmt = sharedConnection.createStatement()) {
>> stmt.executeUpdate("INSERT INTO demo (name) VALUES ('Jeff'),('Jones'),('Agnes'),('Wolfgang')", Statement.RETURN_GENERATED_KEYS);
>> try (ResultSet rs = stmt.getGeneratedKeys()) {
>> while (rs.next()) {
>> System.out.println(rs.getString(1));
>> }
>> }
>> }
>> server will return for example "last insert id" 1 and 4 new rows.
>>
>> Driver will reconstruct the inserted Id according to @@auto_increment_increment.
>> will return
>> 1
>> 2 (= 1 + @@auto_increment_increment)
>> 3 (= 1 + 2 * @@auto_increment_increment)
>> 4 (= 1 + 3 * @@auto_increment_increment)
>>
>> In JDBC, standard way is to use PrepareStatement (and it's better to avoid injection than created a String like the previous one) and batch methods.
>> Example :
>> String[] names = new String[] {"Jeff", "Jones", "Agnes", "Wolfgang"};
>> try (PreparedStatement pstmt = sharedConnection.prepareStatement("INSERT INTO demo (name) VALUES (?)", Statement.RETURN_GENERATED_KEYS)) {
>> for (String name : names) {
>> pstmt.setString(1, name);
>> pstmt.addBatch();
>> }
>> pstmt.executeBatch();
>>
>> try (ResultSet rs = pstmt.getGeneratedKeys()) {
>> while (rs.next()) {
>> System.out.println(rs.getString(1));
>> }
>> }
>> }
>> Server will send to driver informations for each insert in the order corresponding to the addBatch() methods.
>> There is no reconstruction this way.
>>
>> I'll add this to documentation next week
>>
>> diego
>>
>>
>>
>>> On Thu, Aug 25, 2016 at 4:38 PM, Péter Éberhardt <eberhardt.peter@xxxxxxxxx> wrote:
>>> Hi,
>>>
>>> I want to insert multiple records into a table using one statement
>>> like this through jdbc:
>>>
>>> INSERT INTO demo (name) VALUES ('Jeff'),('Jones'),('Agnes'),...,('Wolfgang');
>>>
>>> Then I want to get the generated ids with the getGeneratedKeys()
>>> method and match them to the inserted records but how can I be sure
>>> the method gives the ids in the same order as I listed the records in
>>> the statement? I can't find any related information in the
>>> documentation just the fact the method gives back those ids.
>>>
>>> DDL:
>>>
>>> CREATE TABLE demo (id bigint primary key auto_increment , name text);
>>>
>>> If this information would put into the document also then I can go
>>> with my implementation on this way.
>>>
>>> Thanks,
>>> Peter
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~maria-discuss
>>> Post to : maria-discuss@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~maria-discuss
>>> More help : https://help.launchpad.net/ListHelp
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~maria-discuss
>> Post to : maria-discuss@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~maria-discuss
>> More help : https://help.launchpad.net/ListHelp
References