意外的AUTO_INCREMENT行为

时间:2015-07-14 14:45:17

标签: codeigniter auto-increment mariadb

我们有一台运行PHP 5.6.7的服务器,mariadb 10.0.17-MariaDB。 我们有一个CodeIgniter应用程序,其中有两个表: 与point_trigger相关联的trigger_filterpoint_trigger_id,一对多。两者都将id列设置为带AUTO_INCREMENT的整数(因此没有复合键)。这就是他所说的:

  1. 客户端通过Web界面删除了point_trigger之一。 Sa基本上称为控制器,然后从point_trigger删除行trigger_filter并从/delete/235删除一行(在这种情况下只有一行)。记录了呼叫,它以point_trigger_id结束,这意味着用于查找要删除的行的235设置为point_trigger。到目前为止一切顺利。

  2. 几天后,客户再次访问网络界面并添加新的point_trigger

  3. 客户端调用,因为他创建的点触发器意外行为。

  4. 我们检查数据库,并且point_trigger NOT 在ID中有差距,这意味着用户创建的235具有< strong>相同的ID ,即trigger_filter。我们检查了关联的point_trigger表,而且没有差距,此表的自动增量ID就是下一个。

  5. 我们知道(或者我们知道我们知道)的是,删除添加在删除行方面都没问题。我们认为,因为删除前一个客户端后创建的point_trigger具有不同的参数,并且在删除和添加之前没有记录任何编辑。

    所以有一些东西使得AUTO_INCREMENT在删除和添加select t.value from table t where t.amount <= 5 order by t.amount desc limit 1; 之间的时间内重新计算。任何人都可以告诉我们或者只是指出它可能是什么?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

  用户创建的

具有相同的ID,即235

这可能是一系列事件吗?

  1. INSERT行并获得235分配
  2. DELETE 235,离开MAX(id)= 234
  3. 关闭MariaDB
  4. 启动MariaDB
  5. 插入行并再次获得235.
  6. 详细说明第5步:

    • 打开表格 - 找到MAX(id)+1(234 + 1)作为下一个要为AUTO_INCREMENT分配的ID
    • INSERT现在获取该值(235)。

    抱歉,但这就是它的工作方式。 AUTO_INCREMENT可以随时保证唯一性,而不是始终保持唯一性。