mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
New way to fix BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY UPDATE".
This bug report was two problems: 1) LAST_INSERT_ID() returns a value which does not exist in the table 2) the reporter would want it to return the autoinc id of the updated row. 1) is a real bug, 2) is a feature request. In July I implemented 2) in 5.1 (which automatically fixes 1). This has not yet been documented or released, so is changeable. Precisely, recently Paul and a user found an easy workaround to give 2), which works in 4.1-5.0-5.1. So I can revert my code for 2), because it's not needed, that's what I do here; we forget about 2) (we will document the workaround). But when I revert my code for 2), 1) comes back. We solve 1) by saying that if INSERT ON DUPLICATE KEY UPDATE updates a row, it's like a regular UPDATE: LAST_INSERT_ID() should not be affected (instead of returning a non-existent value). So note: no behaviour change compared to the last released 5.1; just a bugfix for 1).
This commit is contained in:
@ -1145,16 +1145,15 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
||||
}
|
||||
info->updated++;
|
||||
/*
|
||||
If ON DUP KEY UPDATE updates a row instead of inserting one, and
|
||||
there is an auto_increment column, then SELECT LAST_INSERT_ID()
|
||||
returns the id of the updated row:
|
||||
If ON DUP KEY UPDATE updates a row instead of inserting one, it's
|
||||
like a regular UPDATE statement: it should not affect the value of a
|
||||
next SELECT LAST_INSERT_ID() or mysql_insert_id().
|
||||
Except if LAST_INSERT_ID(#) was in the INSERT query, which is
|
||||
handled separately by THD::arg_of_last_insert_id_function.
|
||||
*/
|
||||
insert_id_for_cur_row= table->file->insert_id_for_cur_row= 0;
|
||||
if (table->next_number_field)
|
||||
{
|
||||
longlong field_val= table->next_number_field->val_int();
|
||||
thd->record_first_successful_insert_id_in_cur_stmt(field_val);
|
||||
table->file->adjust_next_insert_id_after_explicit_value(field_val);
|
||||
}
|
||||
table->file->adjust_next_insert_id_after_explicit_value(table->next_number_field->val_int());
|
||||
trg_error= (table->triggers &&
|
||||
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
|
||||
TRG_ACTION_AFTER, TRUE));
|
||||
|
Reference in New Issue
Block a user