Php 如何获取MySQL中最后更新行的ID?
如何使用PHP获取MySQL中最后一个更新行的ID?如果您只进行插入,并且希望从同一会话中获得一个,请按照peirix的回答执行。如果要进行修改,则需要修改数据库架构以存储最近更新的条目 如果您想要上一次修改的id,它可能来自不同的会话(即不是当前运行的PHP代码刚刚完成的会话,而是响应不同请求完成的会话),您可以在表中添加一个名为last_modified的时间戳列(有关信息,请参阅),然后在更新时,设置上次修改=当前时间 设置好后,您可以使用如下查询: 按上次修改的描述限制1从表顺序中选择id;Php 如何获取MySQL中最后更新行的ID?,php,mysql,Php,Mysql,如何使用PHP获取MySQL中最后一个更新行的ID?如果您只进行插入,并且希望从同一会话中获得一个,请按照peirix的回答执行。如果要进行修改,则需要修改数据库架构以存储最近更新的条目 如果您想要上一次修改的id,它可能来自不同的会话(即不是当前运行的PHP代码刚刚完成的会话,而是响应不同请求完成的会话),您可以在表中添加一个名为last_modified的时间戳列(有关信息,请参阅),然后在更新时,设置上次修改=当前时间 设置好后,您可以使用如下查询: 按上次修改的描述限制1从表顺序中选择i
获取最近修改的行。上次更新行的ID与您在“updateQuery”中用于查找和更新该行的ID相同。所以,只要保存(调用)该ID就可以了
last\u insert\u id()
取决于AUTO\u INCREMENT
,但最后更新的id不是 我找到了这个问题的答案:)
通过aefxx编辑
可以进一步扩展此技术,以检索受update语句影响的每一行的ID:
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
UPDATE items
SET qwe = 'qwe'
WHERE asd = 'asd';
这将返回一个字符串,其中所有ID都用逗号连接。不需要这么长的Mysql代码。在PHP中,查询应如下所示:
$updateQuery = mysql_query("UPDATE table_name SET row='value' WHERE id='$id'") or die ('Error');
$lastUpdatedId = mysql_insert_id();
嘿,我只是需要这样一个技巧——我用另一种方式解决了它,也许它会对你有用。注意:这不是一个可扩展的解决方案,对于大型数据集来说非常糟糕 将查询分为两部分- 首先,选择要更新的行的ID并将其存储在临时表中 其次,将update语句中的条件更改为temp_table中的
where id
,执行原始更新
为了确保并发性,您需要在这两个步骤之前打开表,然后在最后释放锁
同样,对于以limit 1
结尾的查询,这对我来说也很有效,因此我甚至不使用临时表,而只是使用一个变量来存储第一次选择的结果
我更喜欢这种方法,因为我知道我总是只更新一行,而且代码很简单 这与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;
此代码全部来自和。我刚刚组装好它。SET@uids:=”;
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;
更新myf_u_;ingtable
设置id=id
其中id<5
和(选择@uids:=CONCAT_WS(',,CAST(id为字符集utf8),@uids));
选择@uids;
我必须投下id(不知道为什么)。。。或者我无法获取@uids内容(它是一个blob)
顺便说一句,非常感谢Pomyk的回答 嗯,我很惊讶,在这些答案中,我没有找到最简单的解决办法
假设,item\u id
是items
表中的整数标识列,您使用以下语句更新行:
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
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();
如果只需要更新真正更改的行,则需要通过最后一次插入id检查行中的数据是否要更改来添加项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语句中以这种方式工作,在其他任何地方都是比较运算符
所以选择@var=1+1
将保持@var
不变,并返回布尔值(1或0,取决于@var的当前值),而选择@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\u insert\u id(user\u id)
告诉MySQL将其内部变量设置为找到的行的id。当您像这样将一个值传递给last\u insert\u id(expr)
时,它最终返回该值,在像这里这样的id的情况下,该值始终是一个正整数,因此总是计算为true,不会干扰where子句。这仅在实际找到某行时有效,因此请记住检查受影响的行。然后可以通过多种方式获取ID
您可以在不调用LAST_INSERT_ID()的情况下生成序列,但是
以这种方式使用函数的实用性在于ID值是
作为最后一个自动生成的值在服务器中维护。信息技术
多用户是否安全,因为多个客户端可以发布更新
语句,并使用SELECT语句获取它们自己的序列值
(或mysql_insert_id()),不影响其他
生成自己的序列值的客户端
返回由
以前的INSERT或UPDATE语句。完成后使用此功能
在包含
自动增量字段,或已使用INSERT或UPDATE设置列
价值