我有一种情况,只能查询固定次数的特定行,例如1000次。之后,该特定行将永久不可用。每个查询只返回1个结果,即LIMIT = 1。Postgres:返回结果后更新查询计数器
我打算通过计数器以1000开始,并以查询次数递减来实现此目的。
无论如何,在返回结果后,我能够立即增加计数器吗?
这与等待应用层接收结果并发送UPDATE语句以增加计数器的结果相反。因为在返回结果直到收到UPDATE查询的时间之间,可能会有另一个查询。
我有一种情况,只能查询固定次数的特定行,例如1000次。之后,该特定行将永久不可用。每个查询只返回1个结果,即LIMIT = 1。Postgres:返回结果后更新查询计数器
我打算通过计数器以1000开始,并以查询次数递减来实现此目的。
无论如何,在返回结果后,我能够立即增加计数器吗?
这与等待应用层接收结果并发送UPDATE语句以增加计数器的结果相反。因为在返回结果直到收到UPDATE查询的时间之间,可能会有另一个查询。
您可以使用一个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;
这似乎是一个绝妙的想法。 – Calvintwr 2015-03-14 08:36:42
不幸的是,你不能在PostgreSQL中创建SELECT触发器。但你可以通过交易实现这一
testdb=# BEGIN;
SELECT something FROM Some_table WHERE <where_criteria>;
UPDATE Some_table SET value = value - 1 WHERE <where_criteria>
COMMIT;
这两个语句
认沽SELECT和UPDATE在单个事务中一起使用。 – Kevin 2015-03-13 14:23:19
但我不知道在我选择之前要更新什么。 – Calvintwr 2015-03-13 14:39:38
这个想法是在选定的行上进行更新。 – Calvintwr 2015-03-13 14:39:57