2015-03-13 37 views
1

我有一種情況,只能查詢固定次數的特定行,例如1000次。之後,該特定行將永久不可用。每個查詢只返回1個結果,即LIMIT = 1。Postgres:返回結果後更新查詢計數器

我打算通過計數器以1000開始,並以查詢次數遞減來實現此目的。

無論如何,在返回結果後,我能夠立即增加計數器嗎?

這與等待應用層接收結果併發送UPDATE語句以增加計數器的結果相反。因爲在返回結果直到收到UPDATE查詢的時間之間,可能會有另一個查詢。

+0

認沽SELECT和UPDATE在單個事務中一起使用。 – Kevin 2015-03-13 14:23:19

+0

但我不知道在我選擇之前要更新什麼。 – Calvintwr 2015-03-13 14:39:38

+0

這個想法是在選定的行上進行更新。 – Calvintwr 2015-03-13 14:39:57

回答

1

您可以使用一個CTE,做了選擇和一個查詢中的UPDATE where_criteria應該是相同的:

CREATE TABLE foo(
    id int primary key, 
    content text, 
    counter int default 0); 

INSERT INTO foo(id, content, counter) VALUES(1, 'foo', default); 
INSERT INTO foo(id, content, counter) VALUES(2, 'bar', default); 
INSERT INTO foo(id, content, counter) VALUES(3, 'baz', default); 

-- select the data and update the counter: 
    WITH step_1 AS (
     SELECT * FROM foo WHERE counter < 5 ORDER BY id LIMIT 1 -- now you can use LIMIT as well 
    ), step_2 AS (
     UPDATE foo SET counter = foo.counter + 1 FROM step_1 WHERE foo.id = step_1.id RETURNING foo.* 
    ) 
    SELECT * FROM step_2; 
+0

這似乎是一個絕妙的想法。 – Calvintwr 2015-03-14 08:36:42

1

不幸的是,你不能在PostgreSQL中創建SELECT觸發器。但你可以通過交易實現這一

testdb=# BEGIN; 
SELECT something FROM Some_table WHERE <where_criteria>; 
UPDATE Some_table SET value = value - 1 WHERE <where_criteria> 
COMMIT; 


這兩個語句

+0

嘿謝謝人! – Calvintwr 2015-03-13 16:03:10

+0

我可以問你什麼時候開始交易,你選擇的行是否被鎖定? – Calvintwr 2015-03-13 16:12:15

+2

PostgreSQL沒有使用鎖定機制它使用MVCC來實現隔離 – 2015-03-13 16:17:32