Pom*_*myk 222
我找到了这个问题的答案:)
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;
Run Code Online (Sandbox Code Playgroud)
由aefxx 编辑
可以进一步扩展此技术以检索受update语句影响的每一行的ID:
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
Run Code Online (Sandbox Code Playgroud)
这将返回一个字符串,其中所有ID都以逗号连接.
new*_*ver 33
嗯,我很惊讶在答案中我没有看到最简单的解决方案.
假设,item_id
是items
表中的整数标识列,并使用以下语句更新行:
UPDATE items
SET qwe = 'qwe'
WHERE asd = 'asd';
Run Code Online (Sandbox Code Playgroud)
然后,要在语句之后立即知道最新受影响的行,您应该将语句稍微更新为以下内容:
UPDATE items
SET qwe = 'qwe',
item_id=LAST_INSERT_ID(item_id)
WHERE asd = 'asd';
SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)
如果您只需要更新真正更改的行,则需要通过LAST_INSERT_ID检查添加item_id的条件更新,以检查数据是否会在行中更改.
Cha*_*Nau 10
这与Salman A的答案方法相同,但这是您实际需要的代码.
首先,编辑您的表,以便在修改行时自动跟踪它.如果您只想知道最初插入行的时间,请删除最后一行.
ALTER TABLE mytable
ADD lastmodified TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
然后,要找出最后更新的行,您可以使用此代码.
SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
此代码全部从MySQL vs PostgreSQL中解除:在表和MySQL手册中添加"上次修改时间"列:排序行.我刚装好了.
Vla*_*nea 10
这是官方简单但非常反直觉.如果你这样做:
last_insert_id(user_id)
把它改成这个:
where
的添加last_insert_id(expr)
中last_insert_id()
子句告诉MySQL来设置它的内部变量为所找到的行的ID.当你传递一个mysql_insert_id()
像这样的值时,它最终会返回该值,在此类ID的情况下,这个值总是一个正整数,因此总是求值为true,从不干扰where子句.这仅在实际找到某行时有效,因此请记住检查受影响的行.然后,您可以通过多种方式获取ID.
您可以在不调用LAST_INSERT_ID()的情况下生成序列,但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护.它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或mysql_insert_id())获取自己的序列值,而不会影响或受其他生成自己的序列值的客户端的影响.
MySQL的 last_insert_id(user_id)
返回先前INSERT或UPDATE语句为AUTO_INCREMENT列生成的值.在对包含AUTO_INCREMENT字段的表执行INSERT语句或使用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()函数返回的值.
把它们放在一起:
update users set status = 'processing' where status = 'pending'
limit 1
Run Code Online (Sandbox Code Playgroud)
(仅供参考,DB类在这里.)
小智 5
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;
Run Code Online (Sandbox Code Playgroud)
我不得不转换 id(不知道为什么)...或者我无法获得 @uids 内容(它是一个 blob)顺便说一句,非常感谢 Pomyk 的回答!
查询:
$sqlQuery = "UPDATE
update_table
SET
set_name = 'value'
WHERE
where_name = 'name'
LIMIT 1;";
Run Code Online (Sandbox Code Playgroud)
PHP功能:
function updateAndGetId($sqlQuery)
{
mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery));
return mysql_insert_id();
}
Run Code Online (Sandbox Code Playgroud)
这对我有用;)
归档时间: |
|
查看次数: |
165154 次 |
最近记录: |