如何获取MySQL中最后更新的行的ID?

Avi*_*ash 124 php mysql

如何使用PHP获取MySQL中最后更新行的ID?

Pom*_*myk 222

我找到了这个问题的答案:)

SET @update_id := 0;
UPDATE some_table SET column_name = 'value', id = (SELECT @update_id := id)
WHERE some_other_column = 'blah' LIMIT 1; 
SELECT @update_id;
Run Code Online (Sandbox Code Playgroud)

由aefxx 编辑

可以进一步扩展此技术以检索受update语句影响的每一行的ID:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
Run Code Online (Sandbox Code Playgroud)

这将返回一个字符串,其中所有ID都以逗号连接.

  • 甚至不需要使用变量.`LAST_INSERT_ID()`可以接受一个参数,该参数将设置下次调用`LAST_INSERT_ID()`返回的值.例如:`UPDATE表SET id = LAST_INSERT_ID(id),row ='value'WHERERE_row ='blah';`.现在,`SELECT LAST_INSERT_ID();`将返回更新的id.有关更多详细信息,请参阅newtover的答案. (7认同)
  • 不能相信这有0个upvotes,并且mysql_insert_id()评论不是OP所要求的那个有13个.感谢Pomyk,一个聪明的把戏! (6认同)
  • 也许每个人都理解这一点,但如果你使用mysql_query(); 你必须将它分成三个不同的调用,但它会起作用. (4认同)
  • @SteveChilds我只是在评论newtover的问题,并希望为你所描述的陷阱添加一个解决方案.如果没有任何UPDATE,则将LAST_INSERT_ID设置为0:`UPDATE lastinsertid_test SET row ='value'WHERE row ='asd'AND LAST_INSERT_ID(id)OR LAST_INSERT_ID(0);`.但是它不会检索多个ID,所以这个答案更好. (3认同)

new*_*ver 33

嗯,我很惊讶在答案中我没有看到最简单的解决方案.

假设,item_iditems表中的整数标识列,并使用以下语句更新行:

UPDATE items
SET qwe = 'qwe'
WHERE asd = 'asd';
Run Code Online (Sandbox Code Playgroud)

然后,要在语句之后立即知道最新受影响的行,您应该将语句稍微更新为以下内容:

UPDATE items
SET qwe = 'qwe',
    item_id=LAST_INSERT_ID(item_id)
WHERE asd = 'asd';
SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

如果您只需要更新真正更改的行,则需要通过LAST_INSERT_ID检查添加item_id的条件更新,以检查数据是否会在行中更改.

  • 它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或mysql_insert_id())获取自己的序列值,而不会影响或受其他生成自己的序列值的客户端的影响.根据https://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id (3认同)
  • 如果查询让您感到困惑,因为LAST_INSERT_ID(expr)将返回UPDATE调用的expr值,您也可以像这样使用它:`UPDATE items SET qwe ='qwe'WHERE asd ='asd'AND LAST_INSERT_ID(item_id ); SELECT LAST_INSERT_ID();` (3认同)
  • @arleslie,如果您按照上面brutuscat评论中的文档链接,您将看到它不会.这是针对该情况的预期行为. (2认同)
  • 这确实是正确的答案。尽管查询看起来有点违反直觉,但这正是 MySQL 文档所说的。 (2认同)

Cha*_*Nau 10

这与Salman A的答案方法相同,但这是您实际需要的代码.

首先,编辑您的表,以便在修改行时自动跟踪它.如果您只想知道最初插入行的时间,请删除最后一行.

ALTER TABLE mytable
ADD lastmodified TIMESTAMP 
    DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

然后,要找出最后更新的行,您可以使用此代码.

SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

此代码全部从MySQL vs PostgreSQL中解除:在表MySQL手册中添加"上次修改时间"列:排序行.我刚装好了.

  • 如果第二次插入在第一次插入查询之后完成,则此方法可能会获取错误的id.但是,如果我们对此查询使用'WHERE',即SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1 WHERE(某些与最后一次插入查询相关的条件),那么它可能会阻止获取错误的id. (6认同)

Vla*_*nea 10

这是官方简单但非常反直觉.如果你这样做:

last_insert_id(user_id)

把它改成这个:

where

的添加last_insert_id(expr)last_insert_id()子句告诉MySQL来设置它的内部变量为所找到的行的ID.当你传递一个mysql_insert_id()像这样的值时,它最终会返回该值,在此类ID的情况下,这个值总是一个正整数,因此总是求值为true,从不干扰where子句.这仅在实际找到某行时有效,因此请记住检查受影响的行.然后,您可以通过多种方式获取ID.

MySQL的 mysqli_insert_id()

您可以在不调用LAST_INSERT_ID()的情况下生成序列,但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护.它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或mysql_insert_id())获取自己的序列值,而不会影响或受其他生成自己的序列值的客户端的影响.

MySQL的 last_insert_id(user_id)

返回先前INSERT或UPDATE语句为AUTO_INCREMENT列生成的值.在对包含AUTO_INCREMENT字段的表执行INSERT语句或使用INSERT或UPDATE设置具有LAST_INSERT_ID(expr)的列值后,请使用此函数.

LAST_INSERT_ID()和mysql_insert_id()之间差异的原因是LAST_INSERT_ID()在脚本中易于使用,而mysql_insert_id()尝试提供有关AUTO_INCREMENT列发生的更准确信息.

PHP where

使用LAST_INSERT_ID()函数执行INSERT或UPDATE语句也将修改mysqli_insert_id()函数返回的值.

把它们放在一起:

update users set status = 'processing' where status = 'pending'
limit 1
Run Code Online (Sandbox Code Playgroud)

(仅供参考,DB类在这里.)


小智 5

SET @uids := "";
UPDATE myf___ingtable
   SET id = id
   WHERE id < 5
  AND ( SELECT @uids := CONCAT_WS(',', CAST(id AS CHAR CHARACTER SET utf8), @uids) );
SELECT @uids;
Run Code Online (Sandbox Code Playgroud)

我不得不转换 id(不知道为什么)...或者我无法获得 @uids 内容(它是一个 blob)顺便说一句,非常感谢 Pomyk 的回答!


Gig*_*ili 5

查询:

$sqlQuery = "UPDATE 
            update_table 
        SET 
            set_name = 'value' 
        WHERE 
            where_name = 'name'
        LIMIT 1;";
Run Code Online (Sandbox Code Playgroud)

PHP功能:

function updateAndGetId($sqlQuery)
{
    mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery));
    return mysql_insert_id();
}
Run Code Online (Sandbox Code Playgroud)

这对我有用;)