maria-discuss team mailing list archive
-
maria-discuss team
-
Mailing list archive
-
Message #03894
Re: When using the getGeneratedKeys() method the keys are returned, but in which order?
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
Follow ups
References