2013-02-22 107 views
1

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

我想每次读取行时都要存储时间戳,以便能够删除长时间没有收到的数据。

首先我想先执行SELECT查询,竟然发现有点慢,但简单的解决方案就像

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

,但我还是想找到一个正常的方式来做到这一点。

我还认为,首先更新一次,然后就选择更新的行要容易得多,但如下我没有发现即使是在这个

回答

1

任何声明time柱:

CREATE TABLE foo (
    ... 
    time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(), 
    ...) 

然后,每当更新一行时,该列将自动更新。

UPDATE:

我不认为有一种方法来选择过程中自动更新,所以你必须做的两个步骤:

UPDATE foo 
SET time = NOW() 
WHERE <conditions>; 

SELECT <columns> 
FROM foo 
WHERE <conditions>; 

只要不包括time专栏我认为这应该工作。为了最大限度地提高安全性,您需要使用交易来防止其他查询的干扰。

+0

我想重写每个选择的时间戳,而不是更新 – 2013-02-22 22:30:44

+0

我认为你的标题是误导。您想要更新选定的行,而不是选择更新的行。无论如何,看到我更新的答案。 – Barmar 2013-02-22 22:36:22

+0

顺序无关紧要。我认为这应该是一个更好的解决方案,然后执行两次几乎相同的查询。但你似乎是正确的 – 2013-02-22 22:44:43

1

对于单行UPDATE在MySQL中你可以:

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

+0

不,它会返回〜50个值。 因为这么简单的事情,不是真的想要更改数据库吗 – 2013-02-22 22:37:52

0

@Erwin Brandstetter:不难扩展使用用户变量与CONCAT_WS()获取多个ID的策略。 对不起,仍然不能添加评论...

+0

我不是很擅长sql,我怎么能从结果字符串中找回id? – 2013-02-23 10:01:32

+0

取决于您的实际UPDATE语句;而是沿着(重新)在查询中设置一个已知的用户变量,将每个ID附加到变量,然后再检索它。 – fenway 2013-02-24 21:01:18