gpt4 book ai didi

mysql - 如何减少 MySQL 中的整数?

转载 作者:行者123 更新时间:2023-11-30 21:28:33 24 4
gpt4 key购买 nike

我有一台使用 MySQL 数据库存储用户的服务器。我有一个整数作为主键。整数为主键,自增。

问题是当注册失败时(在我的服务器提供的网站上)整数仍然增加1,这意味着:如果用户注册成功,用户将获得id一。就像它应该的那样。但是,如果用户随后注册失败(例如用户名已被占用),然后成功注册,则用户将获得 3 的 id。

我正在寻找类似这样的语法:UserId--UserId = Userid - 1

最佳答案

自动增量值不是连续的。它们必须是唯一的,仅此而已。

如果您尝试减少错误时的自动增量值,您将在您的应用程序中创建竞争条件。例如:

  1. 您的 session 尝试注册用户。假设这会生成 id 41。
  2. 同时运行的第二个 session 也尝试注册用户。这会生成 id 42。
  3. 您的 session 返回一个错误,因为您尝试注册的用户名已经存在。所以你试图强制 MySQL 减少自动增量。
  4. 第三个 session 使用 ID 41 注册另一个用户。自动递增,因此下一次注册将使用 ID 42。
  5. 下一个 session 尝试使用 id 42 进行注册,但此 id 已被使用,导致大规模歇斯底里,股市崩盘,狗和猫开始同居。

教训:不要执着于 id 是连续的。他们必然会不时出现差距。要么插入失败,要么回滚事务,要么删除记录等。MySQL 中甚至存在一些错误,有时会导致自增跳过数字。但是这些错误没有实际后果。

避免上述竞争条件的方法是自动递增不能递减,即使插入失败也是如此。它只会增加。这有时会导致“丢失”值。

我曾帮助过一家公司,遇到与您完全相同的情况,如果用户名已被占用,则注册新用户名会导致错误。在他们的案例中,我们发现使用他们网站的人每天都在创建一个新帐户,并且他们正在自动化。他们会尝试“user1”并得到一个错误,然后尝试“user2”和“user3”等等,直到他们找到一个可用的。但是它导致自动增量值被丢弃,并且每天差距越来越大。最终,他们用完了整数,因为每次注册都会丢失 1500 多个 id 值。

(该站点是一个在线赌博站点,我们猜测某些用户试图创建每日一次性帐户,并且他们编写了一个循环以通过用户N 注册用户 1,但他们重新开始每天 1 次,没有意识到数据库的后果。)

我向他们推荐了这个修复方法:首先将他们应用中的注册码更改为用户名的 SELECT。如果存在,则向用户返回友好警告,并要求他们选择另一个名称进行注册。这是在不尝试插入的情况下完成的。

如果 SELECT 发现没有用户名,则尝试 INSERT,但无论如何都要准备好处理错误,以防其他 session 在 SELECT 和 INSERT 之间“窃取”该用户名。希望这种情况会很少见,因为有人在这两个步骤之间偷偷注册的机会很小。

无论如何,不​​要觉得必须有连续的 id 值。

关于mysql - 如何减少 MySQL 中的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57535122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com