我正在使用PostgreSQL并使用Python3.4应用程序通过SQLAlchemy访问它。
当我从数据库中获取一个仍然存在的对象/行,修改它并将其存储回来时,该行将移动到表的末尾。
我想阻止这一点。
我希望所有行的顺序与创建的顺序相同,无论它们更新的频率如何。
答案 0 :(得分:1)
您观察到的很可能是没有ORDER BY
的查询结果,在这种情况下,行以任意顺序返回。 Postgres通常(但不一定)在这种情况下以物理顺序检索行。
与@Haleemur所评论的相反,UPDATE
实际上与PostgreSQL的MVCC模型中的DELETE
和INSERT
非常相似。为每次更新编写新的行版本。除非更新这些列,否则不会重写超行存储的大型列("TOASTed")。
所以,如果你没有ORDER BY
(你可能应该这样做),行更新时通常会移动到表的末尾(根据它们的物理位置),但这可以随时更改,没有警告,例如另一个UPDATE
或VACUUM
。永远不要依赖物理位置。
无论如何,我希望所有行的顺序与创建的顺序相同 他们多久更新一次。
因此,在表格中添加serial
列并按其排序:
CREATE TABLE foo (foo_id serial PRIMARY KEY, foo text);
SELECT * FROM foo ORDER BY foo_id;