即使使用自动递增的主键,插入也是乱序的

Inserts are out of order even with auto-incrementing primary key

我有一个包含 3 列的 table:id(自动递增 PK)、product_idproject_id

product_idproject_id 是外键。这 2 列也有一个唯一键。

我发现当我执行一个简单的 "SELECT * FROM myTable" 时,结果主要不是按 id 列排序。它们似乎首先按 id 排序,然后是其他 2 列。所以,我将 (5, 10) 插入到 table 中,然后是 (5, 6),然后是 select 它们,我得到:

编号 | product_id | project_id

2 | 5 | 6

1 | 5 | 10

这是怎么发生的?

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

我推断 MySQL 正在使用您的 UNIQUE 索引来读取这些行,因此它们是按 product_id 先从该索引读取的顺序,然后是 project_id。

以此类推,如果您从 telephone 书中读取姓名,您将按姓氏然后是名字的顺序读取它们。这就是它们的存储顺序,无论先分配哪个 phone 号码。

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

通常情况下,数据库没有"default"顺序,因此如果不指定隐式顺序,则无法对结果的最终顺序做出任何假设。如果您需要以任何特定顺序检索记录,您应该在查询末尾附加“ORDER BY”。 请注意,如果没有 order by 子句,完全相同的查询可能会以截然不同的顺序生成结果。

当缺少 ORDER BY 时不依赖订单。

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

因此甚至不能保证两个看起来相同的查询 return 会产生相同的顺序:如果您不指定它,则不能依赖它。