【问题标题】:PostgreSQL - retrieving items in order they were storedPostgreSQL - 按存储顺序检索项目
【发布时间】:2015-09-21 15:49:09
【问题描述】:

各位,我有下表:

CREATE TABLE IF NOT EXISTS users(
 userid           CHAR(100)         NOT NULL,
 assetid          text              NOT NULL,
 date             timestamp         NOT NULL,
 PRIMARY KEY(userid, assetid)
);

在我运行一些插入查询后,例如:

INSERT INTO users (userid, assetid, date) VALUES ( foo, bar, now() );

我想按记录在数据库中的存储顺序检索记录。但是,我似乎没有按顺序取回记录。

我应该如何修改我的检索语句?

SELECT * FROM users WHERE userid=foo;

我希望按照存储的顺序对结果进行排序:)

谢谢!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    为了扩展 Mark 的正确答案,PostgreSQL 不保留行时间戳,也不按任何特定顺序保留行。除非您使用包含插入时间戳的列来定义表,否则无法按照插入的顺序选择它们。

    PostgreSQL 通常会按照它们插入的顺序返回它们,但这只是因为它们恰好是磁盘上的那个顺序。当你在桌子上做updates 或deletes 然后稍后inserts 时,这将改变。像vacuum full 这样的操作也会改变它。如果没有明确的 order by 子句,您永远不应该依赖订单。

    此外,如果您希望事务中的行的插入时间戳不同,您可以使用clock_timestamp 而不是now()。另外,请使用 SQL 标准的current_timestamp 而不是写now()

    【讨论】:

      【解决方案2】:

      假设您的 date 列使用 ORDER BY 子句为每个项目保存不同的时间戳:

      SELECT * FROM users WHERE userid=foo ORDER BY "date";
      

      但是,如果您在单个事务中插入大量记录,date 列值可能对所有记录都相同 - 如果是这样,则无法判断哪个是先插入的(从信息)。

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多