我有一種情況,只能查詢固定次數的特定行,例如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