2

有没有简单的方法来选择更新的行?

我试图在每次读取行时存储时间戳,以便能够删除长时间未读取的数据。

首先我尝试SELECT先执行查询,甚至发现有点慢但简单的解决方案,比如

 UPDATE foo AS t, (SELECT id FROM foo WHERE statement=1)q
 SET t.time=NOW() WHERE t.id=q.id

但我仍然想找到一种正常的方法来做到这一点。

我也认为先更新时间然后只选择更新的行应该容易得多,但我什至没有找到任何东西

4

4 回答 4

3

对于 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 没有这样的东西。

于 2013-02-22T22:34:56.807 回答
2

声明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我认为这应该有效的列。为了获得最大的安全性,您需要使用事务来防止其他查询干扰。

于 2013-02-22T22:27:54.043 回答
1

@Erwin Brandstetter:不难扩展使用用户变量的策略CONCAT_WS()来取回多个 ID。 抱歉,仍然无法添加评论...

于 2013-02-23T02:45:39.307 回答
0

正如这里所建议的,您可以提取修改后的主键以在之后更新其时间戳列。

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 ,)。

于 2021-06-27T20:27:28.947 回答