从SQL中丢失的ID号停止自动递增?

时间:2018-04-27 07:46:44

标签: mysql sql mysql-workbench

我已将我的ID列设置为自动递增,但因为我的用户名列是UNIQUE,当用户尝试输入已经被占用的用户名时,它会拒绝整行但是当下一个人输入包含有效信息的信息时,因为前一个被拒绝,所以ID计数为1,3,4。

有没有办法阻止id通过SQL跳过一个数字?

1 个答案:

答案 0 :(得分:0)

有办法吗?嗯,是的。它主要涉及将更新写为:

  • 锁定表,这样任何线程都无法尝试插入或更新。
  • 在表格中找到最大ID并添加1。
  • 使用新ID插入新行。
  • 解锁桌子。

通常,数据库不允许您锁定整个表。所以,你已经实现了额外的机制来处理这个 - 基本上,用户是一个用户实现的信号量(你可以维基百科)。

这会产生许多额外的,容易出错的代码,但可以完成。它会导致插入速度变慢,因为您长时间将线程锁定在表中。数据库没有这样做是有充分理由的。

差距是否会对数据库的性能产生影响?几乎没有效果。我认为用完ID会有问题,但问题就是删除。

如果间隙的唯一原因是无效数据,那么您可以通过在执行select之前使用insert检查数据来最小化事件。这不是'#34;修复"问题,因为两个独立的线程仍然可以尝试同时插入相同的数据。此外,某些数据库在某些情况下会分配数字块。我不确定MySQL是否会这样做。