在mysql中选择更新的行

时间:2013-02-22 22:18:34

标签: mysql sql database

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

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

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

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

但我仍然想找到一种正常的做法。

我还认为首先更新时间然后只选择更新的行应该更容易,但我甚至找不到任何东西

4 个答案:

答案 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),用更新语句替换最后的 ,