2013-02-22 101 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