防止在PostgreSQL / SQLAlchemy中重新排序更新的对象/行

时间:2015-04-11 01:36:06

标签: python sql postgresql sqlalchemy sql-order-by

我正在使用PostgreSQL并使用Python3.4应用程序通过SQLAlchemy访问它。

当我从数据库中获取一个仍然存在的对象/行,修改它并将其存储回来时,该行将移动到表的末尾。

我想阻止这一点。

我希望所有行的顺序与创建的顺序相同,无论它们更新的频率如何。

1 个答案:

答案 0 :(得分:1)

您观察到的很可能是没有ORDER BY的查询结果,在这种情况下,行以任意顺序返回。 Postgres通常(但不一定)在这种情况下以物理顺序检索行。

与@Haleemur所评论的相反,UPDATE实际上与PostgreSQL的MVCC模型中的DELETEINSERT非常相似。为每次更新编写新的行版本。除非更新这些列,否则不会重写超行存储的大型列("TOASTed")。

所以,如果你没有ORDER BY(你可能应该这样做),行更新时通常会移动到表的末尾(根据它们的物理位置),但这可以随时更改,没有警告,例如另一个UPDATEVACUUM。永远不要依赖物理位置。

  

无论如何,我希望所有行的顺序与创建的顺序相同   他们多久更新一次。

因此,在表格中添加serial列并按其排序:

CREATE TABLE foo (foo_id serial PRIMARY KEY, foo text);

SELECT * FROM foo ORDER BY foo_id;