好吧,我的问题是每次我更新一行时,这一行都会转到表格的最后一个位置。放在哪里并不重要。
我在这篇文章Postgresql: row number changes on update中读到,关系表中的行没有排序。那么,为什么当我执行select * from table;
时,我总是得到相同的订单?
无论如何,我不想开始讨论,只是为了知道是否有任何方法不让更新句子将行放在最后一个位置。
编辑以获取更多信息:
我真的不想得到所有结果。我用Java编写了2个按钮,next
和previous
,并且仍然是一个初学者,我必须获得下一行或上一行的唯一方法是使用select * from table limit 1
并添加offset num++
或offset num--
取决于点击的按钮。因此,当我执行更新时,我丢失了初始订单(插入订单)。
感谢。
答案 0 :(得分:0)
您可以在表格中留出一些空间以进行更新。将填充因子从默认的100%更改为页面上没有更新的空间,更少为更新创建空间。
来自manual(创建表格):
fillfactor(整数)
表的fillfactor是百分比 10到100之间.100(完全包装)是默认值。当一个 指定较小的fillfactor,INSERT操作打包表页 仅达到指定的百分比;每页上的剩余空间是 保留用于更新该页面上的行。这为UPDATE提供了机会 将行的更新副本放在与原始页面相同的页面上, 这比将它放在不同的页面上效率更高。为一个 条目永远不会更新的表格,完整的包装是最好的 选择,但在更新的表中,较小的填充因子是 适当。无法为TOAST表设置此参数。
但是如果查询中没有ORDER BY,则无法保证结果集的排序方式与预期排序方式相同。没有填充因子可以改变它。