即使使用自动递增主键,插入也会出现故障

时间:2016-08-29 17:32:19

标签: mysql sql-order-by

我有一个包含3列的表格:id(自动递增PK),product_idproject_id

product_idproject_id是外键。这两列还有一个唯一的密钥。

我发现当我做一个简单的“SELECT * FROM myTable”时,id列主要不会对结果进行排序。它们似乎首先按id排序,但后来又排列其他2列。所以,我将(5,10)插入表中然后(5,6),然后选择它们,我得到:

id | product_id | PROJECT_ID

2 | 5 | 6

1 | 5 | 10

这是怎么发生的?

3 个答案:

答案 0 :(得分:1)

如果您没有明确请求ORDER BY的订单,MySQL会按照从索引中读取的顺序显示结果。

我推断MySQL正在使用你的UNIQUE索引读取这些行,因此首先按照product_id,然后按project_id按顺序读取它们。

通过类比,如果您从电话簿中读取姓名,则按姓氏顺序,然后按名字顺序阅读。这是他们存储的顺序,无论首先分配了哪个电话号码。

id列是主键,它隐式附加到每个非主索引。

答案 1 :(得分:1)

通常情况下,数据库没有"默认"如果您没有指定隐式订单,则不能对结果的最终顺序做出任何假设。如果您需要以任何特定顺序检索记录,则应附加"订购"在您的查询结束时。 请注意,没有order by子句的完全相同的查询可以以非常不同的顺序产生结果。

答案 2 :(得分:0)

缺少ORDER BY时,请不要依赖订单。

ORDER BY关键字默认按升序对记录进行排序。要按降序对记录进行排序,可以使用DESC关键字。

所以甚至不能保证看起来相同的两个查询会以相同的顺序返回结果:如果你没有指定它,你就不能依赖它。