如何使用PHP获取MySQL中最后更新行的ID?
答案 0 :(得分:218)
我找到了这个问题的答案:)
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;
这将返回一个字符串,其中包含以逗号连接的所有ID。
答案 1 :(得分:31)
假设item_id
是items
表中的整数标识列,您使用以下语句更新行:
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的条件更新,检查数据是否会在行中更改。
答案 2 :(得分:10)
这与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: Adding a 'Last Modified Time' Column to a Table和MySQL Manual: Sorting Rows。我刚装好了。
答案 3 :(得分:9)
这是正式的简单但非常直观。如果你在做:
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
在last_insert_id(user_id)
子句中添加where
告诉MySQL 将其内部变量设置为找到的行的ID。当你像这样传递一个值last_insert_id(expr)
时,它最终会返回该值,在此类ID的情况下,这个值总是一个正整数,因此总是求值为true,从不干扰where子句。这仅在实际找到某行时有效,因此请记住检查受影响的行。然后,您可以通过多种方式获取ID。
您可以在不调用LAST_INSERT_ID()的情况下生成序列,但是 这种方式使用函数的效用是ID值 在服务器中维护为最后自动生成的值。它 是多用户安全的,因为多个客户端可以发出UPDATE 声明并使用SELECT语句获取自己的序列值 (或mysql_insert_id()),不影响或受其他影响 生成自己的序列值的客户端。
返回由AUTO_INCREMENT列生成的值 以前的INSERT或UPDATE语句。完成后使用此功能 在包含一个表的表中执行INSERT语句 AUTO_INCREMENT字段,或已使用INSERT或UPDATE设置列 值为LAST_INSERT_ID(expr)。
LAST_INSERT_ID()和。之间存在差异的原因 mysql_insert_id()是LAST_INSERT_ID()易于使用的 mysql_insert_id()尝试提供更精确的脚本 有关AUTO_INCREMENT列的内容的信息。
使用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 class is here。)
答案 4 :(得分:5)
查询:
$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();
}
这对我有用;)
答案 5 :(得分:2)
上次更新的行的ID与您在'updateQuery'中使用的ID相同更新那一行。所以,只需要保存(调用)你想要的ID。
last_insert_id()
取决于AUTO_INCREMENT
,但最后更新的ID不是。
答案 6 :(得分:2)
将您的查询分为两部分 -
首先,选择要更新的行的ID并将其存储在临时表中。
其次,将更新语句中的条件更改为where id in temp_table
进行原始更新。
为了确保并发性,在这两个步骤之前需要lock表,然后在结束时释放锁。
同样,这适用于我,对于以limit 1
结尾的查询,所以我甚至不使用临时表,而只是一个变量来存储第一个select
的结果。
我更喜欢这种方法,因为我知道我总是只更新一行,代码很简单。
答案 7 :(得分:2)
更多以上接受的答案
对于那些对:=
& =
强>
:=
和=
之间存在显着差异,即:=
在任何地方都可以作为变量赋值运算符使用,而=
仅在SET语句中以这种方式工作,并且是其他地方的比较运算符。
因此SELECT @var = 1 + 1;
将保持@var
不变并返回布尔(1或0取决于@var的当前值),而SELECT @var := 1 + 1;
将更改@var
至 2 ,返回2 。
[Source]
答案 8 :(得分:1)
如果您只是进行插入,并且想要在同一个会话中进行插入,请按照peirix的回答进行操作。如果要进行修改,则需要修改数据库模式以存储最近更新的条目。
如果你想要上次修改的id,这可能是来自不同的会话(即不是刚刚由当前运行的PHP代码完成的那个,而是为了响应不同的请求而完成的),可以在表中添加一个名为last_modified的TIMESTAMP列(有关信息,请参阅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; 获取最近修改的行。
答案 9 :(得分: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(dunno为什么)...或者我无法获得@uids内容(这是一个blob) 非常感谢Pomyk的回答!
答案 10 :(得分:1)
我的解决方案是,首先确定&#34; id&#34; (@uids)使用select命令并在使用@uids更新此id后。
SET @uids := (SELECT id FROM table WHERE some = 0 LIMIT 1);
UPDATE table SET col = 1 WHERE id = @uids;SELECT @uids;
它适用于我的项目。
答案 11 :(得分:-8)
不需要这么长的Mysql代码。在PHP中,查询应该如下所示:
$updateQuery = mysql_query("UPDATE table_name SET row='value' WHERE id='$id'") or die ('Error');
$lastUpdatedId = mysql_insert_id();