Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql SELECT语句的历史结果_Postgresql_Pagination - Fatal编程技术网

Postgresql SELECT语句的历史结果

Postgresql SELECT语句的历史结果,postgresql,pagination,Postgresql,Pagination,我想查询大量行并显示给用户,但是用户只会看到例如10行,我将使用“限制”和“偏移”,他将在用户界面中按“下一步”按钮,然后提取接下来的10行 数据库将一直更新,是否有任何方法可以保证用户将看到下10行的数据,就像在第一次选择中一样,因此,如果用户选择查看下10行结果,则不会反映数据中的任何更改 这就像使用SELECT语句作为过去的快照一样,第一次SELECT之后的任何后续更新对于后续SELECT LIMIT OFFSET都将不可见。您可以使用游标,例如: drop table if exists

我想查询大量行并显示给用户,但是用户只会看到例如10行,我将使用“限制”和“偏移”,他将在用户界面中按“下一步”按钮,然后提取接下来的10行

数据库将一直更新,是否有任何方法可以保证用户将看到下10行的数据,就像在第一次选择中一样,因此,如果用户选择查看下10行结果,则不会反映数据中的任何更改


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

您可以使用游标,例如:

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;
请注意,这是一个相当昂贵的解决方案。声明的游标将创建一个包含完整结果集(快照)的临时表。这可能会导致严重的服务器负载。就我个人而言,我宁愿寻找替代方法(具有动态结果)


阅读文档:,。

您想要的是所谓的分页性能非常重要,它将作为一个概念工作,但不是一种实用的方式。如果您想要快照,实际上您别无选择。一旦创建,光标将非常快。主要的成本是创建一个临时表。或者,您可以在客户端维护分页,但这需要将整个结果发送到客户端。