Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取MySQL中最后更新行的ID?_Php_Mysql - Fatal编程技术网

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

Php 如何获取MySQL中最后更新行的ID?,php,mysql,Php,Mysql,如何使用PHP获取MySQL中最后一个更新行的ID?如果您只进行插入,并且希望从同一会话中获得一个,请按照peirix的回答执行。如果要进行修改,则需要修改数据库架构以存储最近更新的条目 如果您想要上一次修改的id,它可能来自不同的会话(即不是当前运行的PHP代码刚刚完成的会话,而是响应不同请求完成的会话),您可以在表中添加一个名为last_modified的时间戳列(有关信息,请参阅),然后在更新时,设置上次修改=当前时间 设置好后,您可以使用如下查询: 按上次修改的描述限制1从表顺序中选择i

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

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

如果您想要上一次修改的id,它可能来自不同的会话(即不是当前运行的PHP代码刚刚完成的会话,而是响应不同请求完成的会话),您可以在表中添加一个名为last_modified的时间戳列(有关信息,请参阅),然后在更新时,设置上次修改=当前时间

设置好后,您可以使用如下查询: 按上次修改的描述限制1从表顺序中选择id;
获取最近修改的行。

上次更新行的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设置列 价值