SELECT语句的历史结果

时间:2017-05-13 12:08:14

标签: postgresql pagination

我想查询大量的行并显示给用户,但是用户只会看到10行,我会使用LIMIT和OFFSET,他会按下' next'用户界面中的按钮将被提取下一行。

数据库会一直更新,有没有办法保证用户会看到第一个选择中的下10行数据,所以如果他没有反映数据的任何变化选择查看接下来的10行结果。

这就像使用SELECT语句作为过去的快照一样,第一个SELECT之后的任何后续更新都不会对后续的SELECT LIMIT OFFSET可见。

1 个答案:

答案 0 :(得分:1)

您可以使用游标,例如:

drop table if exists test;
create table test(id int primary key);
insert into test 
select i from generate_series(1, 50) i;

declare cur cursor with hold for
select * from test order by id;

move absolute 0 cur; -- get 1st page
fetch 5 cur;

 id 
----
  1
  2
  3
  4
  5
(5 rows)

truncate test;

move absolute 5 cur; -- get 2nd page
fetch 5 cur; -- works even though the table is already empty

 id 
----
  6
  7
  8
  9
 10
(5 rows)

close cur;

请注意,它是相当昂贵的解决方案。声明的游标会创建一个包含完整结果集(快照)的临时表。这可能会导致大量服务器负载。就个人而言,我宁愿寻找替代方法(动态结果)。

阅读文档:DECLAREFETCH