2015-03-13 35 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