mysql - 之后添加自动增量主键时了解 MySQL 的行为

标签 mysql innodb auto-increment

假设我们在 MySQL 数据库中有一个 (InnoDB) 表 associations,它具有以下结构:

CREATE TABLE `associations` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
  `fk_id_1` int(11) NOT NULL,
  `fk_id_2` int(11) NOT NULL,
  `fk_id_3` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
  UNIQUE KEY `some_unique_constraint` (`fk_id_1`,`fk_id_2`),
  KEY `fk_id_2_INDEX` (`fk_id_2`),
  KEY `fk_id_3_INDEX` (`fk_id_3`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin$$

id 列中有跳跃(我知道这是一个问题,即当多个线程尝试获取一个值时如何生成自动增量值)。由于没有其他表使用 id 列作为引用,我计划删除 id 列并重新创建它,希望计数孔将消失。我备份了我的数据库并对其进行了测试。结果有点困惑。行的顺序似乎已经改变。如果我没记错的话,顺序是首先按 fk_id_1 然后是 fk_id_2 然后是 fk_id_3

当为行分配新生成的自动增量键时,这是 MySQL 设置表的自然顺序吗?

在这个过程中,我应该知道更多吗?

我之所以需要了解这一点,是因为我需要使列 id 对我打算完成的另一项任务有用,而差距是不可能的。

最佳答案

在任何主流 RDBS 中,表都没有自然顺序。

只有 SELECT 语句中最外层的 ORDER BY 才能保证结果的顺序。

如果你想“订购”:

  • 创建一个新表
  • 按 fk_id_1、fk_id_2、fk_id_3 插入..选择..排序
  • 删除旧表
  • 重命名新表

或者与差距一起生活......强制症对开发人员不利

编辑:

问题说“不依赖”这个值,但事实证明是存在的。

如果不允许间隙,则不要使用自动编号并使用 fk_id_1、fk_id_2、fk_id_3 作为您的 key ,并使用 ROW_NUMBER 模拟。或对您的下游进行编码以处理差距。

自动编号会有差距:生活中不变的事实。

关于mysql - 之后添加自动增量主键时了解 MySQL 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221459/

相关文章:

php - 使用php和mysql有效禁止IP?

mysql - 试图找到与 MySQL 等效的 iSeries SQL 命令。特别是 "LABEL ON"命令

MySQL 下一条/上一条记录

php - 如何处理 PHP 通过并发 Android 应用服务调用更新 MySQL 表中的一行?

MySQL 自动增量=535

mysql - 如何在MySQL中创建唯一的递增计数器

c++ - 使用 "Curiously Recurring Template Pattern"的增量数

mysql - 将列数据转换为列名称

MySQL 问题 : autoID not starting with 1

postgresql - PostgreSQL 自动增量是否可能出现竞争条件