伙计们,我有下表:
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;
我希望按照存储的顺序对结果进行排序:)
谢谢!
答案 0 :(得分:5)
为了扩展Mark的正确答案,PostgreSQL不会保留行时间戳,并且它不会以任何特定顺序保留行。除非您使用包含插入时间戳的列定义表,否则无法按插入顺序选择它们。
PostgreSQL通常会按照它们插入的顺序返回它们,但这只是因为它们碰巧在磁盘上按顺序排列。这会在您在桌面上update
或deletes
以及之后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
列值可能对所有记录都相同 - 如果是这样,则无法确定先插入哪个(从给出的信息)。