意外 AUTO_INCREMENT 行为

Unexpected AUTO_INCREMENT behaviour

我们有一个服务器 运行 PHP 5.6.7,mariadb 10.0.17-MariaDB。 我们有一个 CodeIgniter 应用程序,其中有两个 table: point_triggertrigger_filter,与point_trigger_id相连,一对多。两者都有一个 id 列设置为带有 AUTO_INCREMENT 的整数(因此没有复合键)。这就是 heppened:

  1. 客户通过 Web 界面删除了其中一个 point_trigger。 Sa 基本上调用了一个控制器,然后从 point_trigger 中删除了一行,并从 trigger_filter 中删除了一行(在本例中只有一行)。调用已记录,它以 /delete/235 结尾,这意味着用于定位要删除的行的 point_trigger_id 已设置为 235。到目前为止一切顺利。

  2. 几天后客户端再次进入 Web 界面并添加新的 point_trigger.

  3. 客户来电,因为他创建的点触发器行为异常。

  4. 我们检查了数据库,然后... point_trigger table NOT 在 id 上有差距,这意味着用户创建的 point_trigger 具有 相同的 ID,即 235。我们检查关联的 trigger_filter table 而这个也 没有间隙 ,这个 table 的自动递增 id 只是下一个.

我们确实知道(或认为我们知道)的是 deleteadd 在删除行。我们认为,因为客户端在删除前一个后创建的 point_trigger 具有不同的参数,并且 在删除和添加 .

之前没有记录任何编辑

所以显然有一些东西使得 AUTO_INCREMENT 在 point_trigger 的删除和添加之间的时间重新计算。任何人都可以告诉我们或只是指出它可能是什么吗?

提前致谢!

that user created has the same id which is 235

难道这就是事件的来龙去脉?

  1. 插入行并分配 235
  2. 删除 235,留下 MAX(id)=234
  3. 关闭 MariaDB
  4. 启动 MariaDB
  5. 插入行并再次获得 235。

详细说明第 5 步:

  • Open table -- 查找 MAX(id)+1 (234+1) 作为下一个要分配给 AUTO_INCREMENT
  • 的 id
  • INSERT 现在获取该值 (235)。

抱歉,这就是它的工作方式。 AUTO_INCREMENT 保证任何时刻的唯一性,而不是所有时间的唯一性。