有没有简单的方法来选择更新的行?
我试图在每次读取行时存储时间戳,以便能够删除长时间未读取的数据。
首先我尝试SELECT
先执行查询,甚至发现有点慢但简单的解决方案,比如
UPDATE foo AS t, (SELECT id FROM foo WHERE statement=1)q
SET t.time=NOW() WHERE t.id=q.id
但我仍然想找到一种正常的方法来做到这一点。
我也认为先更新时间然后只选择更新的行应该容易得多,但我什至没有找到任何东西
对于 MySQL 中的单行 UPDATE
,您可以:
UPDATE foo
SET time = NOW()
WHERE statement = 1
AND @var := id
@var := id
总是TRUE
,但它会在更新前id
将 的值写入变量 @var 。那么你也能:
SELECT @var;
在PostgreSQL中,您可以使用该RETURNING
子句。
Oracle也有一个RETURNING
子句。
SQL-Server有一个OUTPUT
子句。
但是 MySQL 没有这样的东西。
声明time
列如下:
CREATE TABLE foo (
...
time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(),
...)
然后,每当更新一行时,该列将自动更新。
更新:
我认为没有办法在 SELECT 期间自动更新,因此您必须分两步完成:
UPDATE foo
SET time = NOW()
WHERE <conditions>;
SELECT <columns>
FROM foo
WHERE <conditions>;
只要不包括time
我认为这应该有效的列。为了获得最大的安全性,您需要使用事务来防止其他查询干扰。
@Erwin Brandstetter:不难扩展使用用户变量的策略CONCAT_WS()
来取回多个 ID。 抱歉,仍然无法添加评论...
正如这里所建议的,您可以提取修改后的主键以在之后更新其时间戳列。
SET @uids := null; UPDATE footable SET foo = 'bar' WHERE fooid > 5 AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) ); SELECT @uids;
来自https://gist.github.com/PieterScheffers/189cad9510d304118c33135965e9cddb
SELECT @uids;
因此,您应该通过拆分结果值来用更新语句替换 final @uids
(它将是一个包含所有修改后的 id 除以 的 varchar ,
)。