我已将我的id列设置为自动递增,但由于我的用户名列是唯一的,当用户尝试输入一个已使用的用户名时,它会拒绝整行,但当下一个人输入带有有效信息的信息时,由于上一个人被拒绝,id计数将变为1,3,4。有没有办法阻止id通过sql跳过一个数字?
vmpqdwk31#
有办法吗?嗯,是的。它基本上包括将更新编写为:锁定表,这样就没有线程可以尝试插入或更新。在表中找到最大id并添加1。插入具有新id的新行。打开table。通常,数据库不允许锁定整个表。因此,您需要实现额外的机制来处理这个问题——基本上,用户实现了一个用户实现的信号量(您可以在维基百科上看到)。这会产生大量额外的、容易出错的代码,但这是可以做到的。这会导致插入速度慢得多,因为您要将线程从表中锁定很长一段时间。数据库不这样做有一个很好的理由。这些差距对数据库的性能有影响吗?几乎没有任何效果。我想ID用完会有一些潜在的问题,但是这个问题相当严重。如果间隙的唯一原因是无效数据,则可以通过使用 select 做手术前 insert . 这并不能“修复”问题,因为两个独立的线程仍然可以同时尝试插入相同的数据。此外,有些数据库在某些情况下分配数字块。我不确定mysql是否曾经这样做过。
select
insert
1条答案
按热度按时间vmpqdwk31#
有办法吗?嗯,是的。它基本上包括将更新编写为:
锁定表,这样就没有线程可以尝试插入或更新。
在表中找到最大id并添加1。
插入具有新id的新行。
打开table。
通常,数据库不允许锁定整个表。因此,您需要实现额外的机制来处理这个问题——基本上,用户实现了一个用户实现的信号量(您可以在维基百科上看到)。
这会产生大量额外的、容易出错的代码,但这是可以做到的。这会导致插入速度慢得多,因为您要将线程从表中锁定很长一段时间。数据库不这样做有一个很好的理由。
这些差距对数据库的性能有影响吗?几乎没有任何效果。我想ID用完会有一些潜在的问题,但是这个问题相当严重。
如果间隙的唯一原因是无效数据,则可以通过使用
select
做手术前insert
. 这并不能“修复”问题,因为两个独立的线程仍然可以同时尝试插入相同的数据。此外,有些数据库在某些情况下分配数字块。我不确定mysql是否曾经这样做过。