更新是否会更改 PostgreSQL 中 table 中记录的顺序?
Does update change the order of records in a table in PostgreSQL?
我的代码取决于 table 中记录的顺序。我的假设是 table 可以被视为一个列表,以便记录保持顺序。我有一个小的更新代码,如下所示,它将更新 table 中特定索引处的记录。
p = pieces[index]
p.position = 0
p.save
我检查了这次更新之前和之后的记录顺序然后我看到更新之后更新的记录被移到了列表的最后。我打印 Piece.all 来打印列表。订单在 mysql 中维护,但是当我将它部署到使用 postgre 的 heroku 时,订单没有维护,所以这对我来说是一个令人惊讶的发现。
难道table秒内不能保证顺序,不应该依赖于顺序吗?请纠正我的误解,谢谢你的澄清。
您说:
My assumption was that a table can be considered a list so that the
records maintain order.
这是不正确的。 table 表示 无序 集合。 table 中没有固有的顺序。结果集同样缺乏排序。保证结果集排序的唯一方法是在查询中使用 ORDER BY
。
因此,更新会更改一行或多行中一列或多列的值。它不会更改行的“排序”,因为它们没有排序。
注意:在某些情况下,查询可能 出现 到 return 结果的特定顺序。你真的不应该依赖这种行为,除非查询有明确的 ORDER BY
.
在我看来,你永远不应该依赖订单。
根据 sql 规范,行以未指定的顺序 return 编辑,除非您添加 order by 子句。在 Postgres 中,这意味着您将获取行,基本上是按照活动行在磁盘上读取的顺序。
MySQL 倾向于按照插入的顺序 return 行,这就是为什么您会看到不同的行为。
如果您希望它们始终按创建顺序 returned,您可以使用 Item.order("created_at")
表格通常是无序的,除非它们有 CLUSTER
(ed) index,否则应该假定为无序。这是一条重要的信息,因为了解聚簇索引在某种程度上是有用的。也就是说,您从查询中收到的 resultset 应该被假定为无序,因为连接顺序 always 未定义。
因此,如果顺序问题始终是明确的并使用 ORDER BY
。 现在为了说明,让我们玩得开心。
CREATE TABLE bar ( qux serial PRIMARY KEY, asdf text );
INSERT INTO bar (asdf) ( VALUES ('z'),('x'),('g'),('a') );
现在我们有了这个,
SELECT * FROM BAR;
qux | asdf
-----+------
1 | z
2 | x
3 | g
4 | a
现在我们创建一个 CLUSTER
ed 索引,
CREATE INDEX asdfidx ON bar (asdf);
CLUSTER bar USING asdfidx;
现在订单是保证的,
SELECT * FROM bar;
qux | asdf
-----+------
4 | a
3 | g
2 | x
1 | z
我的代码取决于 table 中记录的顺序。我的假设是 table 可以被视为一个列表,以便记录保持顺序。我有一个小的更新代码,如下所示,它将更新 table 中特定索引处的记录。
p = pieces[index]
p.position = 0
p.save
我检查了这次更新之前和之后的记录顺序然后我看到更新之后更新的记录被移到了列表的最后。我打印 Piece.all 来打印列表。订单在 mysql 中维护,但是当我将它部署到使用 postgre 的 heroku 时,订单没有维护,所以这对我来说是一个令人惊讶的发现。
难道table秒内不能保证顺序,不应该依赖于顺序吗?请纠正我的误解,谢谢你的澄清。
您说:
My assumption was that a table can be considered a list so that the records maintain order.
这是不正确的。 table 表示 无序 集合。 table 中没有固有的顺序。结果集同样缺乏排序。保证结果集排序的唯一方法是在查询中使用 ORDER BY
。
因此,更新会更改一行或多行中一列或多列的值。它不会更改行的“排序”,因为它们没有排序。
注意:在某些情况下,查询可能 出现 到 return 结果的特定顺序。你真的不应该依赖这种行为,除非查询有明确的 ORDER BY
.
在我看来,你永远不应该依赖订单。
根据 sql 规范,行以未指定的顺序 return 编辑,除非您添加 order by 子句。在 Postgres 中,这意味着您将获取行,基本上是按照活动行在磁盘上读取的顺序。
MySQL 倾向于按照插入的顺序 return 行,这就是为什么您会看到不同的行为。
如果您希望它们始终按创建顺序 returned,您可以使用 Item.order("created_at")
表格通常是无序的,除非它们有 CLUSTER
(ed) index,否则应该假定为无序。这是一条重要的信息,因为了解聚簇索引在某种程度上是有用的。也就是说,您从查询中收到的 resultset 应该被假定为无序,因为连接顺序 always 未定义。
因此,如果顺序问题始终是明确的并使用 ORDER BY
。 现在为了说明,让我们玩得开心。
CREATE TABLE bar ( qux serial PRIMARY KEY, asdf text );
INSERT INTO bar (asdf) ( VALUES ('z'),('x'),('g'),('a') );
现在我们有了这个,
SELECT * FROM BAR;
qux | asdf
-----+------
1 | z
2 | x
3 | g
4 | a
现在我们创建一个 CLUSTER
ed 索引,
CREATE INDEX asdfidx ON bar (asdf);
CLUSTER bar USING asdfidx;
现在订单是保证的,
SELECT * FROM bar;
qux | asdf
-----+------
4 | a
3 | g
2 | x
1 | z