MySQL正在跳过自动增量值
在“我的用户”表中,只有3个字段MySQL正在跳过自动增量值,mysql,sql,database,database-design,auto-increment,Mysql,Sql,Database,Database Design,Auto Increment,在“我的用户”表中,只有3个字段 id (primary key, auto increment), username (not null, unique) and password(not null). 当我尝试插入一个值为“test”和“123”的行时,我得到了1作为主键,然后我再次尝试使用相同的值,得到了键“username”的重复项,正如预期的那样,然后我尝试了“test1”和“123”,得到了3作为主键,跳过了2,为什么它会显示这种行为 MySQL版本是5.7.27。这是一个:
id (primary key, auto increment),
username (not null, unique) and
password(not null).
当我尝试插入一个值为“test”和“123”的行时,我得到了1作为主键,然后我再次尝试使用相同的值,得到了键“username”的重复项,正如预期的那样,然后我尝试了“test1”和“123”,得到了3作为主键,跳过了2,为什么它会显示这种行为
MySQL版本是5.7.27。这是一个:
“丢失”自动增量值和序列间隙
在所有锁定模式(0、1和2)中,如果生成自动增量值的事务回滚,则这些自动增量值将“丢失”。为自动增量列生成值后,无论“类似插入”语句是否完成,以及包含的事务是否回滚,都无法回滚该值。这样丢失的值不会被重用。因此,表的自动增量列中存储的值可能存在间隙
在您的用例中,在检查username
上的唯一约束之前,自动增量被分配一个新值。然后约束检查失败,事务回滚,在序列中留下一个间隙
除可能导致自动增量序列中出现间隙外,还有其他各种情况(例如使用INSERT…IGNORE
或INSERT…ON DUPLICATE KEY
语法时),本质上与事务的隐式或显式回滚相关
底线:不要假设aut_增量键是连续的。所保证的是唯一性,并且在某种程度上是不断增加的数字。请提供该表的定义。如果所有约束都正常,但插入失败,则可以使用“替换”而不是“替换”INSERT@Sony,为了补充GMB提到的底线,也不要试图“修复”你的自动增量是连续的,这也是一个很大的禁忌,因为届时可能会发生错误/问题,如难以调试的竞争条件。。