Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更新是否会更改PostgreSQL中表中记录的顺序?_Ruby On Rails_Postgresql_Sql Order By - Fatal编程技术网

Ruby on rails 更新是否会更改PostgreSQL中表中记录的顺序?

Ruby on rails 更新是否会更改PostgreSQL中表中记录的顺序?,ruby-on-rails,postgresql,sql-order-by,Ruby On Rails,Postgresql,Sql Order By,我的代码取决于表中记录的顺序。我的假设是,一个表可以被视为一个列表,以便记录保持秩序。我有一个小的更新代码,如下所示,它将更新表中特定索引处的记录 p = pieces[index] p.position = 0 p.save 我检查了更新之前和更新之后记录的顺序,然后我看到更新之后,更新的记录被移动到列表的最后一个。我打印单子。全部打印列表。顺序是在mysql中维护的,但当我将其部署到使用postgre的heroku时,顺序没有得到维护,因此这对我来说是一个令人惊讶的发现 是否不能保证表

我的代码取决于表中记录的顺序。我的假设是,一个表可以被视为一个列表,以便记录保持秩序。我有一个小的更新代码,如下所示,它将更新表中特定索引处的记录

p = pieces[index]

p.position = 0

p.save
我检查了更新之前和更新之后记录的顺序,然后我看到更新之后,更新的记录被移动到列表的最后一个。我打印单子。全部打印列表。顺序是在mysql中维护的,但当我将其部署到使用postgre的heroku时,顺序没有得到维护,因此这对我来说是一个令人惊讶的发现


是否不能保证表格中的顺序,并且不应依赖于顺序?请纠正我的误解,感谢您的澄清。

这篇评论太长了

你说:

我的假设是,一个表可以被视为一个列表,因此 记录维持秩序

这是不正确的。表表示无序的集合。表中没有固有的顺序。结果集同样缺乏顺序。确保结果集排序的唯一方法是在查询中使用
orderby

因此,更新会更改一行或多行中一列或多列中的值。它不会更改行的“顺序”,因为它们没有顺序


注意:在某些情况下,查询可能会以特定顺序返回结果。你真的不应该依赖于这种行为,除非查询有一个明确的
orderby

,否则我诚实地认为你永远不应该依赖于顺序

除非添加ORDERBY子句,否则根据sql规范,行将以未指定的顺序返回。在Postgres中,这意味着您将获得行,基本上是按磁盘上实时行读取的顺序

MySQL倾向于按插入的顺序返回行,这就是为什么您会看到不同的行为


如果希望始终按照创建顺序返回,可以使用
项。订单(“创建时间”)

表通常是无序的,除非它们具有。这是一条重要的信息,因为理解聚集索引有些有用。也就是说,从查询返回的结果集应该被假定为无序的,因为连接顺序总是未定义的

因此,如果顺序很重要,请始终明确使用
orderby
来进行说明,让我们来享受一些乐趣

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
现在我们创建一个
聚类
ed索引

CREATE INDEX asdfidx ON bar (asdf);
CLUSTER bar USING asdfidx;
现在订单有保证了

SELECT * FROM bar;
 qux | asdf 
-----+------
   4 | a
   3 | g
   2 | x
   1 | z

严格来说,这是不正确的。Postgres没有聚集索引。
CLUSTER
命令执行一次性排序,但后续写入(例如)不会保留排序。为什么对于标记为Postgres的问题,引用MySQL的答案会被接受。答案通常是正确的,但这似乎很奇怪。OP在最初的问题中引用MySQL作为基本参考:“顺序在MySQL中维护,但当我将其部署到使用postgre的heroku时,顺序没有维护,因此这对我来说是一个令人惊讶的发现。”。这更有道理。