意外 AUTO_INCREMENT 行为
Unexpected AUTO_INCREMENT behaviour
我们有一个服务器 运行 PHP 5.6.7,mariadb 10.0.17-MariaDB。
我们有一个 CodeIgniter 应用程序,其中有两个 table:
point_trigger
和trigger_filter
,与point_trigger_id
相连,一对多。两者都有一个 id
列设置为带有 AUTO_INCREMENT
的整数(因此没有复合键)。这就是 heppened:
客户通过 Web 界面删除了其中一个 point_trigger
。 Sa 基本上调用了一个控制器,然后从 point_trigger
中删除了一行,并从 trigger_filter
中删除了一行(在本例中只有一行)。调用已记录,它以 /delete/235
结尾,这意味着用于定位要删除的行的 point_trigger_id
已设置为 235
。到目前为止一切顺利。
几天后客户端再次进入 Web 界面并添加新的 point_trigger
.
客户来电,因为他创建的点触发器行为异常。
我们检查了数据库,然后... point_trigger
table NOT 在 id 上有差距,这意味着用户创建的 point_trigger
具有 相同的 ID,即 235
。我们检查关联的 trigger_filter
table 而这个也 没有间隙 ,这个 table 的自动递增 id 只是下一个.
我们确实知道(或认为我们知道)的是 delete 和 add 在删除行。我们认为,因为客户端在删除前一个后创建的 point_trigger
具有不同的参数,并且 在删除和添加 .
之前没有记录任何编辑
所以显然有一些东西使得 AUTO_INCREMENT 在 point_trigger
的删除和添加之间的时间重新计算。任何人都可以告诉我们或只是指出它可能是什么吗?
提前致谢!
that user created has the same id which is 235
难道这就是事件的来龙去脉?
- 插入行并分配 235
- 删除 235,留下 MAX(id)=234
- 关闭 MariaDB
- 启动 MariaDB
- 插入行并再次获得 235。
详细说明第 5 步:
- Open table -- 查找 MAX(id)+1 (234+1) 作为下一个要分配给
AUTO_INCREMENT
的 id
- INSERT 现在获取该值 (235)。
抱歉,这就是它的工作方式。 AUTO_INCREMENT
保证任何时刻的唯一性,而不是所有时间的唯一性。
我们有一个服务器 运行 PHP 5.6.7,mariadb 10.0.17-MariaDB。
我们有一个 CodeIgniter 应用程序,其中有两个 table:
point_trigger
和trigger_filter
,与point_trigger_id
相连,一对多。两者都有一个 id
列设置为带有 AUTO_INCREMENT
的整数(因此没有复合键)。这就是 heppened:
客户通过 Web 界面删除了其中一个
point_trigger
。 Sa 基本上调用了一个控制器,然后从point_trigger
中删除了一行,并从trigger_filter
中删除了一行(在本例中只有一行)。调用已记录,它以/delete/235
结尾,这意味着用于定位要删除的行的point_trigger_id
已设置为235
。到目前为止一切顺利。几天后客户端再次进入 Web 界面并添加新的
point_trigger
.客户来电,因为他创建的点触发器行为异常。
我们检查了数据库,然后...
point_trigger
table NOT 在 id 上有差距,这意味着用户创建的point_trigger
具有 相同的 ID,即235
。我们检查关联的trigger_filter
table 而这个也 没有间隙 ,这个 table 的自动递增 id 只是下一个.
我们确实知道(或认为我们知道)的是 delete 和 add 在删除行。我们认为,因为客户端在删除前一个后创建的 point_trigger
具有不同的参数,并且 在删除和添加 .
所以显然有一些东西使得 AUTO_INCREMENT 在 point_trigger
的删除和添加之间的时间重新计算。任何人都可以告诉我们或只是指出它可能是什么吗?
提前致谢!
that user created has the same id which is 235
难道这就是事件的来龙去脉?
- 插入行并分配 235
- 删除 235,留下 MAX(id)=234
- 关闭 MariaDB
- 启动 MariaDB
- 插入行并再次获得 235。
详细说明第 5 步:
- Open table -- 查找 MAX(id)+1 (234+1) 作为下一个要分配给
AUTO_INCREMENT
的 id
- INSERT 现在获取该值 (235)。
抱歉,这就是它的工作方式。 AUTO_INCREMENT
保证任何时刻的唯一性,而不是所有时间的唯一性。