2012-05-03 18 views
4

this,ActiveRecord的first生成SQL:为什么Rails的ActiveRecord最后一个方法由id命令而第一个不?

SELECT * FROM clients LIMIT 1 

而ActiveRecord的last生成SQL:

SELECT * FROM clients ORDER BY clients.id DESC LIMIT 1 

first的行为是不正确的,按我的意见,而在last它是。如果不指定顺序,简单的SELECT将以任意或不可预知的顺序返回。因此,first不保证总是返回相同的记录(如果不是最小的记录)。

有没有人有线索,为什么Rails的ActiveRecord工作呢?

在此先感谢 Panayotis

+0

对不起,我没有得到你。我相信'首先'总是以最小的ID返回记录。在哪种情况下,它的表现会有所不同? – Subodh

+0

@sub_stantial你如何知道/相信'''SELECT * FROM clients LIMIT 1'''会返回最小ID的记录?它在某个地方有记录吗?根据[this](http://www.ehow.com/how_2094997_sort-mysql-query-using-order.html)顺序是任意的和非确定性的。同样在[this](http://dev.mysql.com/doc/refman/5.5/en/sorting-rows.html)中,第一个短语表示结果不以特定顺序返回,除非您应用顺序。请提供任何证明您的陈述的参考资料,我会接受。 –

+0

我只想'先'返回查询返回的第一个结果(它应该是'[0]'的别名)。但是,它改变了我的'GROUP BY'查询以要求使用'.select'故意省略的'id'列(因为ID是唯一的,所以不会有任何分组!)。因此'.first'现在表现得“正确”,但“正确”行为实际上是非常糟糕的行为。 –

回答

0

,我认为它不是一个法律上的,但事实上的规则。大多数数据库按照创建的顺序返回表的内容(所以按照它们的ID顺序),以防未指定顺序。它只是工作。

+1

创建顺序与*的顺序不同*除了auto_increment之外,还有id生成方案,比如UUID。 –

+0

我认为rails中的默认ID生成是基于自动增量的。如果禁用默认ID生成,则可以使用UUID,然后手动设置UUID。它值得尝试看看使用UUID和没有默认ID的表上生成的rails'.first'和'.last'。 – Matzi

相关问题