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

时间:2009-09-07 07:34:03

标签: php mysql

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

12 个答案:

答案 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_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的条件更新,检查数据是否会在行中更改。

答案 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 TableMySQL 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。

MySQL last_insert_id()

  

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

MySQL 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列的内容的信息。

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