假设我们在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
对我打算在差距不大的情况下完成的另一项任务有用。
答案 0 :(得分:4)
任何主流RDBS中的表都没有自然顺序。
只有SELECT语句中最外层的ORDER BY才能保证结果的顺序。
如果您想要“订购”:
或者存在差距... OCD对开发者不利
编辑:
问题说这个值“没有依赖性”但事实证明存在。
如果不允许有间隙,请不要使用自动编号,并使用fk_id_1,fk_id_2,fk_id_3作为密钥,并使用ROW_NUMBER仿真。或者编写下游代码来处理差距。
Autonumbers将有差距:生活中不可改变的事实。