我已将我的ID列设置为自动递增,但因为我的用户名列是UNIQUE,当用户尝试输入已经被占用的用户名时,它会拒绝整行但是当下一个人输入包含有效信息的信息时,因为前一个被拒绝,所以ID计数为1,3,4。
有没有办法阻止id通过SQL跳过一个数字?
答案 0 :(得分:0)
有办法吗?嗯,是的。它主要涉及将更新写为:
通常,数据库不允许您锁定整个表。所以,你已经实现了额外的机制来处理这个 - 基本上,用户是一个用户实现的信号量(你可以维基百科)。
这会产生许多额外的,容易出错的代码,但可以完成。它会导致插入速度变慢,因为您长时间将线程锁定在表中。数据库没有这样做是有充分理由的。
差距是否会对数据库的性能产生影响?几乎没有效果。我认为用完ID会有问题,但问题就是删除。
如果间隙的唯一原因是无效数据,那么您可以通过在执行select
之前使用insert
检查数据来最小化事件。这不是'#34;修复"问题,因为两个独立的线程仍然可以尝试同时插入相同的数据。此外,某些数据库在某些情况下会分配数字块。我不确定MySQL是否会这样做。