是否有简单的方法来选择更新的行?
我正在尝试在每次读取行时存储时间戳,以便能够删除长时间未被读取的数据。
首先,我首先尝试执行SELECT
查询,甚至发现有点慢但很简单的解决方案,如
UPDATE foo AS t, (SELECT id FROM foo WHERE statement=1)q
SET t.time=NOW() WHERE t.id=q.id
但我仍然想找到一种正常的做法。
我还认为首先更新时间然后只选择更新的行应该更容易,但我甚至找不到任何东西
答案 0 :(得分:1)
按如下方式声明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
列,我认为这应该有用。为了最大限度地提高安全性,您需要使用事务来防止其他查询干扰。
答案 1 :(得分:1)
对于MySQL中的单行 UPDATE
,您可以:
UPDATE foo
SET time = NOW()
WHERE statement = 1
AND @var := id
@var := id
始终为TRUE
,但在更新之前,它会将id
的值写入变量@var 。然后你可以:
SELECT @var;
在 PostgreSQL 中,您可以使用RETURNING
clause
Oracle 也有一个RETURNING
clause
SQL-Server 有一个OUTPUT
clause
但MySQL并没有这样的东西。
答案 2 :(得分:0)
@Erwin Brandstetter:使用CONCAT_WS()
的用户变量扩展策略以获取多个ID并不困难。 抱歉,仍然无法添加评论...
答案 3 :(得分:0)
按照here的建议,您可以提取修改后的主键以在之后更新其时间戳列。
<块引用>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;
值(它将是一个包含所有修改后的 id 除以 @uids
的 varchar),用更新语句替换最后的 ,
。>