【问题标题】:Postgresql 11 How can I reorder the physical rows in the database according to a timestampPostgresql 11 如何根据时间戳重新排序数据库中的物理行
【发布时间】:2019-03-24 00:26:12
【问题描述】:

我有一个名为流的表,它有几行,我喜欢根据 created_on 列更改数据库中物理行的顺序。我总共有 179 行, row (id) 179 应该有最新的 created_on 日期,然后 row (id) 178 应该有第二个最新的 created_on 日期。正如您从下面的小 sn-p 中看到的那样,事情不是按顺序排列的,例如 id 172 上的日期比 id 179 上的日期新。我可以通过这样做得到正确的数据

 select * from streams order by created_on desc

但是他们希望它通过 id 进行搜索,例如这样

select * from streams order by id desc

上面的查询产生了下面的结果。我们的一切工作正常,但我们从 Postgres 10 迁移到 Postgres 11 并搞砸了事情的顺序。

【问题讨论】:

  • 您的观众希望先看到最高 ID 还是先看到最新创建的 ID?
  • 最高 ID 也将有最新创建的 ID 优先。但是问题是我们迁移了这 179 条记录,并且它们以随机顺序插入。我现在正试图通过根据最新创建的日期更新这 179 条记录的 ID 来纠正这个问题。我似乎无法找到一种方法来做到这一点。
  • 没有“行的顺序”这样的东西。关系数据库中的行没有任何“顺序”。 only(实际上:only)保证订单的方式是在您select 行时使用order by。如果您以某种方式更改物理顺序,则无法保证查询将按该顺序返回它们。保证订单的唯一方法是使用order by,别无选择。

标签: postgresql postgresql-11


【解决方案1】:

您可以使用UPDATE 重新生成id 列值,如下所示:

UPDATE streams SET id = tmp.row_id
FROM  (SELECT id, row_number() OVER (ORDER BY created_on, id) AS row_id FROM streams) AS tmp
WHERE streams.id = tmp.id;

之后,您可能希望使用CLUSTER 对磁盘上的物理行重新排序:

CLUSTER streams USING <index-for-id-column>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2020-04-15
    • 2021-10-06
    • 1970-01-01
    • 2018-08-09
    • 2021-08-02
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多