mysql数据表新增一行记录,会不会自动按主键自动排序插入,还是会排在最后?

例如mysql数据表user,主键primary key是id,已有3条记录
'1001','haha','aaa@gmail.com'
'1002','hehe','bbb@gmail.com'
'1004','oror','ccc@gmail.com'

然后,新增一行记录,会不会自动按主键自动排序插入到1002之后,还是会排在1004之后?

INSERT INTO user (id,name,email) VALUES ('1003','ThinkPHP','ThinkPHP@gmail.com')

想要的是 插入到1002之后。

阅读 4.4k
4 个回答

我记得按概念来说,关系型数据库的表是记录的无序集合。

你不用 ORDER BY 的话,就该假设他们是乱序的。

查询的时候 根据id 正序查到 不就可以了吗

MySQL 会记录每张表的自增情况,可以使用下列语句查询:

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="表名"

查询结果是这样的:

+----------------+
| AUTO_INCREMENT |
+----------------+
|            xxx |
+----------------+

其实你每次往数据库插入数据的时候,MySQL 都会查出这个数据,然后 +1 得出自增的 ID。通常 AUTO_INCREMENT 是一直累加的,即使移除已经插入的数据 AUTO_INCREMENT 也不会减小。

使用自增主键时,它是一个追加操作
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。
自增主键是指自增列上定义的主键,在建表语句中一般是这么定义的: NOT NULL PRIMARY KEY AUTO_INCREMENT。
插入新记录的时候可以不指定 ID 的值,系统会获取当前 ID 最大值加 1 作为下一条记录的 ID 值。
也就是说,自增主键的插入数据模式,每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。

鉴于你提出的问题,类似于“想要 id 1003 在 1002 之后这种”,我认为你更应该关注查询而不是插入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏