Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否从SQL中缺少ID号的情况下停止自动递增?_Mysql_Sql_Mysql Workbench - Fatal编程技术网

Mysql 是否从SQL中缺少ID号的情况下停止自动递增?

Mysql 是否从SQL中缺少ID号的情况下停止自动递增?,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我已将我的ID列设置为自动递增,但由于我的用户名列是唯一的,当用户尝试输入已使用的用户名时,它将拒绝整行,但当下一个人输入具有有效信息的信息时,由于前一个人被拒绝,ID计数将为go 1,3,4 有没有办法阻止id通过SQL跳过一个数字?有没有办法?嗯,是的。它主要涉及将更新写入以下内容: 锁定表,以便线程甚至无法尝试插入或更新 在表中找到最大id并添加1 插入具有新id的新行 打开桌子 通常,数据库不允许锁定整个表。所以,您已经实现了其他机制来处理这个问题——基本上,用户实现了一个用户实现的

我已将我的ID列设置为自动递增,但由于我的用户名列是唯一的,当用户尝试输入已使用的用户名时,它将拒绝整行,但当下一个人输入具有有效信息的信息时,由于前一个人被拒绝,ID计数将为go 1,3,4


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

有没有办法?嗯,是的。它主要涉及将更新写入以下内容:

  • 锁定表,以便线程甚至无法尝试插入或更新
  • 在表中找到最大id并添加1
  • 插入具有新id的新行
  • 打开桌子
通常,数据库不允许锁定整个表。所以,您已经实现了其他机制来处理这个问题——基本上,用户实现了一个用户实现的信号量(您可以在维基百科上看到)

这会产生大量额外的、容易出错的代码,但这是可以做到的。这会导致插入速度慢得多,因为您要将线程长时间锁定在表外。数据库不这样做有一个很好的理由

这些差距对数据库的性能有影响吗?几乎没有任何效果。我想ID用完可能会有一些问题,但这个问题相当严重


如果间隙的唯一原因是无效数据,则在执行
插入操作之前,您可以使用
选择
检查数据,从而将间隙的发生降至最低。这并不能“修复”问题,因为两个独立的线程仍然可以尝试同时插入相同的数据。此外,有些数据库在某些情况下分配数字块。我不确定MySQL是否会这样做。

您使用的是什么后端语言?为什么要麻烦呢?一个id只是一个id,间隔并不重要。@jarlh有时它确实重要。这是我的一个客户问的。在这种情况下,我自己创建了一个存储过程来处理自动递增。提供一个没有间隙的序列是非常昂贵的,因为在知道当前序列已被使用(或其相关事务已回滚)之前,您无法为其分配任何附加值。这就是为什么大多数数据库系统不承诺提供这样的服务。如果你把它当作一个恰好适合数字列的水滴,你会没事的。如果你把意义赋予数值,你迟早会出错的。@Sandeep不,没关系。即使你的客户要求你这么做,也没关系,客户没有任何线索,或者你在任务中使用了错误的工具。如果需要序列号,请不要依赖于
自动增量
<代码>自动增量
使用顺序算法在高度并发的环境中生成唯一的数字。它的工作不是产生序列号,它从来就不是。强迫它这样做会招致惩罚,巨大的惩罚。只要与这些差距保持平和,你的生活就会好起来。