假设我们在 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/