我遇到的情况是,只能查询特定行的固定次数,例如1000.在此之后,永久性地使该特定方无法使用该行。每个查询只返回1个结果,即LIMIT = 1。
我打算通过一个从1000开始的计数器来减少它的查询次数来实现它。
无论如何,在返回结果时,我能够立即增加其计数器吗?
这与等待应用程序层接收结果然后发送UPDATE语句以递增计数器相反。因为在返回结果到收到UPDATE查询的时间之间,可能会有另一个查询。
答案 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;