在添加自动递增的主键之后了解MySQLs行为
假设在MySQL数据库中有一个(InnoDB)表在添加自动递增的主键之后了解MySQLs行为,mysql,innodb,auto-increment,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
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
对我打算完成的另一项任务有用,因为在空白处是不可能完成的。在任何主流RDB中,表都没有自然的顺序
只有SELECT语句中最外层的ORDER BY才能保证结果的顺序
如果您想要“订单”:
- 创建一个新表
- 插入..选择..按fk_id_1、fk_id_2、fk_id_3排序
- 放下旧桌子
- 重命名新表
自动编号会有缺口:不可改变的生活事实。在任何主流RDB中,表格都没有自然的顺序 只有SELECT语句中最外层的ORDER BY才能保证结果的顺序 如果您想要“订单”:
- 创建一个新表
- 插入..选择..按fk_id_1、fk_id_2、fk_id_3排序
- 放下旧桌子
- 重命名新表
自动编号会有缺口:不可改变的生活事实。我需要使本专栏对我打算完成的另一项任务有用,因为缺口是不可能完成的。不过,谢谢你的回答!我在谷歌上搜索了
ROW\u NUMBER
emulation,结果令人困惑。因此,请确定:您的意思是通过一个额外的列来标识行,该列包含所有三列的所有三个索引?如果是,您所说的ROW_NUMBER
emulation是什么意思?@Aufwind:其他RDBMS在()上有ROW_NUMBER()来生成序列号,例如MySQL没有,但可以解决:这取决于调用之间的序列号是否需要相同。如果不是,则使用行号替换。如果是,则无法使用自动编号。仅供参考:自动编号/标识值无论如何都不应有内在含义。它们只是内部代理键,我需要使本专栏对我打算完成的另一项任务有用,因为在这项任务中,空白是不可能的。不过,谢谢你的回答!我在谷歌上搜索了ROW\u NUMBER
emulation,结果令人困惑。因此,请确定:您的意思是通过一个额外的列来标识行,该列包含所有三列的所有三个索引?如果是,您所说的ROW_NUMBER
emulation是什么意思?@Aufwind:其他RDBMS在()上有ROW_NUMBER()来生成序列号,例如MySQL没有,但可以解决:这取决于调用之间的序列号是否需要相同。如果不是,则使用行号替换。如果是,则无法使用自动编号。仅供参考:自动编号/标识值无论如何都不应有内在含义。它们只是内部代理键