在以后添加自动增量主键时了解MySQL的行为

时间:2011-08-28 14:08:33

标签: 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对我打算在差距不大的情况下完成的另一项任务有用。

1 个答案:

答案 0 :(得分:4)

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

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

如果您想要“订购”:

  • 创建新表
  • INSERT..SELECT..ORDER by fk_id_1,fk_id_2,fk_id_3
  • 放弃旧桌子
  • 重命名新表

或者存在差距... OCD对开发者不利

编辑:

问题说这个值“没有依赖性”但事实证明存在。

如果不允许有间隙,请不要使用自动编号,并使用fk_id_1,fk_id_2,fk_id_3作为密钥,并使用ROW_NUMBER仿真。或者编写下游代码来处理差距。

Autonumbers将有差距:生活中不可改变的事实。