Postgres:返回结果后更新查询计数器

时间:2015-03-13 14:21:05

标签: postgresql

我遇到的情况是,只能查询特定行的固定次数,例如1000.在此之后,永久性地使该特定方无法使用该行。每个查询只返回1个结果,即LIMIT = 1。

我打算通过一个从1000开始的计数器来减少它的查询次数来实现它。

无论如何,在返回结果时,我能够立即增加其计数器吗?

这与等待应用程序层接收结果然后发送UPDATE语句以递增计数器相反。因为在返回结果到收到UPDATE查询的时间之间,可能会有另一个查询。

2 个答案:

答案 0 :(得分:1)

不幸的是,你无法在PostgreSQL中创建SELECT触发器。但你可以通过交易实现这个目的

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


两个陈述的where_criteria应该相同

答案 1 :(得分:1)

您可以在一个查询中使用执行SELECT和UPDATE的CTE:

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;