防止在 PostgreSQL/SQLAlchemy 中重新排序更新的 objects/rows

Prevent re-ordering of updated objects/rows in PostgreSQL/SQLAlchemy

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

当我从数据库中得到一个仍然存在的 object/row 时,对其进行修改并将其存储回来,该行被移动到 table 的末尾。

我想阻止这种情况。

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

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

与@Haleemur 评论的相反,UPDATE 实际上与 PostgreSQL MVCC model. A new row version is written for every update. Only large columns that are stored out-of-line ("TOASTed" 中的 DELETEINSERT 非常相似)不会被重写,除非这些列是已更新。

因此,如果您不 ORDER BY(您可能应该这样做),行通常会在更新时移至 table 的末尾(根据它们的物理位置),但是可以在没有警告的情况下随时更改,例如由另一个 UPDATEVACUUM。永远不要依赖物理位置。

I want all rows in the same order like they where created, no matter how often they are updated.

所以在 table 中添加一个 serial 列并按它排序:

  • Auto increment SQL function

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

SELECT * FROM foo ORDER BY foo_id;