即使使用自动递增的主键,插入也是乱序的
Inserts are out of order even with auto-incrementing primary key
我有一个包含 3 列的 table:id
(自动递增 PK)、product_id
、project_id
。
product_id
和 project_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 会产生相同的顺序:如果您不指定它,则不能依赖它。
我有一个包含 3 列的 table:id
(自动递增 PK)、product_id
、project_id
。
product_id
和 project_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 会产生相同的顺序:如果您不指定它,则不能依赖它。