How to get ID of the last updated row in MySQL?

后端 未结 12 2269
北海茫月
北海茫月 2020-11-22 08:10

How do I get the ID of the last updated row in MySQL using PHP?

12条回答
  •  -上瘾入骨i
    2020-11-22 08:35

    This is officially simple but remarkably counter-intuitive. If you're doing:

    update users set status = 'processing' where status = 'pending'
    limit 1
    

    Change it to this:

    update users set status = 'processing' where status = 'pending'
    and last_insert_id(user_id) 
    limit 1
    

    The addition of last_insert_id(user_id) in the where clause is telling MySQL to set its internal variable to the ID of the found row. When you pass a value to last_insert_id(expr) like this, it ends up returning that value, which in the case of IDs like here is always a positive integer and therefore always evaluates to true, never interfering with the where clause. This only works if some row was actually found, so remember to check affected rows. You can then get the ID in multiple ways.

    MySQL last_insert_id()

    You can generate sequences without calling LAST_INSERT_ID(), but the utility of using the function this way is that the ID value is maintained in the server as the last automatically generated value. It is multi-user safe because multiple clients can issue the UPDATE statement and get their own sequence value with the SELECT statement (or mysql_insert_id()), without affecting or being affected by other clients that generate their own sequence values.

    MySQL mysql_insert_id()

    Returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE statement. Use this function after you have performed an INSERT statement into a table that contains an AUTO_INCREMENT field, or have used INSERT or UPDATE to set a column value with LAST_INSERT_ID(expr).

    The reason for the differences between LAST_INSERT_ID() and mysql_insert_id() is that LAST_INSERT_ID() is made easy to use in scripts while mysql_insert_id() tries to provide more exact information about what happens to the AUTO_INCREMENT column.

    PHP mysqli_insert_id()

    Performing an INSERT or UPDATE statement using the LAST_INSERT_ID() function will also modify the value returned by the mysqli_insert_id() function.

    Putting it all together:

    $affected_rows = DB::getAffectedRows("
        update users set status = 'processing' 
        where status = 'pending' and last_insert_id(user_id) 
        limit 1"
    );
    if ($affected_rows) {
        $user_id = DB::getInsertId();
    }
    

    (FYI that DB class is here.)

提交回复
热议问题