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

如何在MySQL中使用PHP获取最近一次更新的行的ID?

我已经find了这个问题的答案:)

 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; 

由aefxx 编辑

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

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

这将返回一个string,所有的ID由一个冒号连接起来。

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

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

 UPDATE items SET qwe = 'qwe' WHERE asd = 'asd'; 

然后,要知道声明之后的最新受影响的行,您应该稍微更新以下语句:

 UPDATE items SET qwe = 'qwe', item_id=LAST_INSERT_ID(item_id) WHERE asd = 'asd'; SELECT LAST_INSERT_ID(); 

如果只需要更新真正更改的行,则需要通过LAST_INSERT_ID检查来添加item_id的条件更新,以检查数据是否将在行中发生更改。

这与Salman A的答案是一样的,但这里是你实际需要的代码。

首先,编辑你的表格,以便每当一行被修改时它会自动跟踪。 如果只想知道最初插入行的时间,请删除最后一行。

 ALTER TABLE mytable ADD lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 

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

 SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1; 

这个代码全部从MySQL和PostgreSQL中提取:添加一个“上次修改时间”列到一个表和MySQL手册:sorting行 。 我只是组装它。

查询:

 $sqlQuery = "UPDATE update_table SET set_name = 'value' WHERE where_name = 'name' LIMIT 1;"; 

PHP函数:

 function updateAndGetId($sqlQuery) { mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery)); return mysql_insert_id(); } 

这对我有用;)

嘿,我只是需要一个这样的伎俩 – 我以不同的方式解决它,也许它会为你工作。 请注意,这不是一个可扩展的解决scheme,对于大型数据集将会非常糟糕。

把你的查询分成两部分 –

首先,select要更新的行的ID并将其存储在临时表中。

其次,将update语句中的条件更新为where id in temp_table

为了确保并发性,您需要在这两步之前locking表,然后在最后释放锁。

再说一遍,对于我来说,对于以limit 1结束的查询,所以我甚至不使用临时表,而只是一个variables来存储第一个select的结果。

我更喜欢这种方法,因为我知道我总是只更新一行,代码很简单。

最后更新的行的ID与您在'updateQuery'中用于find并更新该行的ID相同。 所以,只要保存(打电话)那个ID在任何你想要的。

last_insert_id()取决于AUTO_INCREMENT ,但最后更新的ID不是。

这是正式的简单,但非常直观。 如果你在做:

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

将其更改为:

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

where子句中增加last_insert_id(user_id)告诉MySQL 其内部variables设置为find的行的ID。 当你像这样给last_insert_id(expr)传递一个值时,它会返回这个值,在这种types的ID的情况下,它总是一个正整数,因此总是计算为真,不会干扰where子句。 这只适用于实际find某一行的行,所以请记住检查受影响的行。 然后您可以通过多种方式获取ID。

MySQL last_insert_id()

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

MySQL的mysql_insert_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 mysqli_insert_id()

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

把它放在一起:

 $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(); } 

( DB级别在这里的 FYI)

如果你只是做插入,并希望来自同一届会议,按照peirix的答案。 如果您正在进行修改,则需要修改数据库模式以存储最近更新的条目。

如果你想要最后一次修改的id,可能来自不同的会话(也就是说,不是刚刚运行的PHP代码,而是一个响应于不同的请求的代码),你可以添加一个将TIMESTAMP列添加到名为last_modified的表(请参阅http://dev.mysql.com/doc/refman/5.1/en/datetime.html获取信息),然后在更新时设置last_modified = CURRENT_TIME。

设置完成后,可以使用如下查询:SELECT ID FROM table ORDER BY last_modified DESC LIMIT 1; 获取最近修改的行。

 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; 

我不得不CAST的id(不知道为什么)…或者我不能得到@ uids内容(这是一个blob)顺便说一句,非常感谢Pomyk答案!

关于上述接受的答案更多
对于那些想知道:==

:==之间有显着的区别,那就是:=作为一个variables赋值操作符,而=仅在SET语句中以这种方式工作,并且在其他地方是比较运算符。

所以SELECT @var = 1 + 1; 会使@var保持不变,并返回一个布尔值 (1或0,取决于@var的当前值),而SELECT @var := 1 + 1;@var更改为2 ,并返回2 。 [资源]

我的解决scheme是,首先使用select命令决定“id”(@uids),然后使用@uids更新此ID。

 SET @uids := (SELECT id FROM table WHERE some = 0 LIMIT 1); UPDATE table SET col = 1 WHERE id = @uids;SELECT @uids; 

它在我的项目上工作。

不需要这么久的Mysql代码。 在PHP中,查询应该看起来像这样:

 $updateQuery = mysql_query("UPDATE table_name SET row='value' WHERE id='$id'") or die ('Error'); $lastUpdatedId = mysql_insert_id();