PostgreSQL - 按照存储顺序检索项目

时间:2015-09-21 15:49:09

标签: postgresql

伙计们,我有下表:

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;

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

PostgreSQL通常会按照它们插入的顺序返回它们,但这只是因为它们碰巧在磁盘上按顺序排列。这会在您在桌面上updatedeletes以及之后insert时更改。像vacuum full这样的操作也会改变它。如果没有明确的order by条款,你永远不应该依赖订单。

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

答案 1 :(得分:4)

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

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

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