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

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

206273 次浏览

如果您只做插入,并希望从同一个会话中插入,请按照 peirix 的答案执行。如果要进行修改,则需要修改数据库模式以存储最近更新的条目。

如果您想要上次修改的 id,它可能来自不同的会话(即不是目前运行的 PHP 代码所做的那个,而是为了响应不同的请求而做的一个) ,您可以向表中添加一个 TIMESTAMP 列,名为 last _ Amendment (参见 http://dev.mysql.com/doc/refman/5.1/en/datetime.html获取信息) ,然后当您更新时,设置 last _ Amendment = CURRENT _ TIME。

设置了这个属性之后,您可以使用如下查询: SELECT id FROM table ORDESCLIMIT 1; 获取最近修改的行。

最后更新的行的 ID 与“ updateQuery”中用于查找和更新该行的 ID 相同。所以,只要保存(调用)该 ID 在任何你想要的。

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

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

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 编辑

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

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

这将返回一个包含用逗号连接的所有 ID 的字符串。

不需要这么长的 Mysql 代码:

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

嘿,我只是需要这样一个把戏-我用不同的方法解决它,也许它会为你工作。注意,这不是一个可伸缩的解决方案,对于大型数据集来说是非常糟糕的。

将查询分成两部分-

首先,选择要更新的行的 id,并将它们存储在一个临时表中。

其次,使用 update 语句中的条件更改为 where id in temp_table来执行原始更新。

为了确保并发性,您需要在这两个步骤之前对表进行 锁定,然后在最后释放锁。

同样,对于以 limit 1结尾的查询,这对我也适用,因此我甚至不使用临时表,而是使用一个变量来存储第一个 select的结果。

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

这个方法与 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 vs PostgreSQL: 向表中添加“上次修改时间”列MySQL 手册: 排序行中提取出来的,我刚刚组装好。

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;

我必须对 id 进行强制转换(不知道为什么) ... ... 否则我无法获得@uids 内容(它是一个 blob) 顺便说一句,非常感谢波米克的回答!

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

假设 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 的条件更新,以确定该行中的数据是否要更改。

质疑:

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

这是我的工作;)

我的解决方案是,首先用 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;

它在我的项目中起作用了。

关于上述答案的进一步说明
对于那些想知道 :==的人

:==之间的显著区别在于,:=在任何地方都是作为变量赋值运算符工作的,而 =只在 SET 语句中是这样工作的,在其他任何地方都是比较运算符。

因此,SELECT @var = 1 + 1;将保持 @var不变,并返回 布尔型(根据@var 的当前值为1或0) ,而 SELECT @var := 1 + 1;将把 @var更改为 2报税表2 [来源]

这在官方意义上很简单,但却非常违反直觉。如果你正在做:

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 准备好了其内部变量为找到的行的 ID。当您像这样向 last_insert_id(expr)传递一个值时,它最终返回该值,对于像这样的 ID,该值始终是一个正整数,因此总是计算为 true,从不干扰 where 子句。这只在实际找到某行时才有效,因此请记住检查受影响的行。然后可以通过多种方式获取 ID。

MySQL last_insert_id()

可以在不调用 LAST _ INSERT _ ID ()的情况下生成序列,但是 这样使用函数的实用工具是 ID 值是 作为最后一个自动生成的值维护在服务器中 是多用户安全的,因为多个客户端可以发出 UPDATE 语句并使用 SELECT 语句获取它们自己的序列值 (或 mysql _ insert _ id ()) ,不影响或受其他 生成自己的序列值的客户端。

MySQL mysql_insert_id()

方法为 AUTO _ INCREMENT 列生成的值 前面的 INSERT 或 UPDATE 语句。在完成 将 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 类来了)