Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在添加自动递增的主键之后了解MySQLs行为_Mysql_Innodb_Auto Increment - Fatal编程技术网

在添加自动递增的主键之后了解MySQLs行为

在添加自动递增的主键之后了解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

假设在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
对我打算完成的另一项任务有用,因为在空白处是不可能完成的。

在任何主流RDB中,表都没有自然的顺序

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

如果您想要“订单”:

  • 创建一个新表
  • 插入..选择..按fk_id_1、fk_id_2、fk_id_3排序
  • 放下旧桌子
  • 重命名新表
或者生活在隔阂中。。。OCD对开发人员不好

编辑:

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

如果不允许间隙,则不要使用自动编号,并使用fk_id_1、fk_id_2、fk_id_3作为键,并使用行号模拟。或者编写下游代码以处理缺口


自动编号会有缺口:不可改变的生活事实。

在任何主流RDB中,表格都没有自然的顺序

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

如果您想要“订单”:

  • 创建一个新表
  • 插入..选择..按fk_id_1、fk_id_2、fk_id_3排序
  • 放下旧桌子
  • 重命名新表
或者生活在隔阂中。。。OCD对开发人员不好

编辑:

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

如果不允许间隙,则不要使用自动编号,并使用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没有,但可以解决:这取决于调用之间的序列号是否需要相同。如果不是,则使用行号替换。如果是,则无法使用自动编号。仅供参考:自动编号/标识值无论如何都不应有内在含义。它们只是内部代理键