我需要设置worldship从我们的postgres数据库中提取。我需要它,以便包按id排序。我没有办法(我知道)让worldship发送order by子句,所以我需要有默认的记录返回按id返回。
第二点,我不知道postgres默认是如何排序的,它看起来像是最后一次更改记录时的排序,所以如果我写了两个记录id 1,2,然后在运行查询时更改记录2,它会返回它们,记录2是第一个。
我需要设置worldship从我们的postgres数据库中提取。我需要它,以便包按id排序。我没有办法(我知道)让worldship发送order by子句,所以我需要有默认的记录返回按id返回。
第二点,我不知道postgres默认是如何排序的,它看起来像是最后一次更改记录时的排序,所以如果我写了两个记录id 1,2,然后在运行查询时更改记录2,它会返回它们,记录2是第一个。
4条答案
按热度按时间oogrdqng1#
根据sql规范,行返回的顺序是不确定的,除非你添加了一个order by子句,在Postgres中,这意味着你将按照实际行在磁盘上读取的顺序来获取行。
如果您想要一个一致的顺序,而不需要添加orderby子句,请按照Jack的注解中的建议创建一个视图。
eoxn13cs2#
没有“默认排序”这样的东西。表中的行不会排序。
您可以使用视图(如Jack Maney所建议的那样)来伪造这一点,但您无法影响返回的行的顺序。
但如果这样做,请注意,向基于该视图的SELECT添加额外的ORDER BY将对数据进行两次排序。
另一个选择 * 可能 * 是在该表上运行CLUSTER命令,以便根据所需的列对磁盘上的行进行物理排序。(但这种可能性相当高)。您需要重新请定期运行此语句,因为不会自动维护CLUSTER命令创建的顺序。
rggaifut3#
从我的测试来看,PostgreSQL的“默认”排序似乎是基于记录最后更新的时间。最近更新的记录将出现在最后。注意,我找不到任何文档来支持这一点。这只是我自己测试中发现的。
2admgd594#
您最终可以使用排序索引,这样可以保证在查询计划命中索引或强制执行索引的情况下检索到的行的顺序,但这种方法将不仅仅是迂回的:)。
ORDER BY
子句是前面提到的方法。