如何防止自动增量跳过mysql数据库中的id号?

时间:2011-04-12 22:00:21

标签: php mysql html forms passwords

好的,我们假设我有一个包含两列的mysql数据库表,一个用于id,另一个用于密码。如果我有三行数据并且id值从1到3并且我删除第3行然后创建另一行数据,我将在新创建的行上看到id = 4而不是id = 3。我知道这与自动增量值有关,但我想知道我是否可以在php文件中添加一些代码,这些代码会自动重置所有id号,这样你就可以从id = 1开始,然后转到最后一个id号。删除一行后增加1?

我的目标是创建一个表单,用户输入密码,系统将密码与数据库中的密码值匹配。如果匹配,将删除具有匹配密码的行,并且将重新排序id号列,以便不跳过任何ID号。

更新:我正在通过将1到4的随机数设置为变量来制作旋转横幅广告系统,以便php文件将使用随机数变量从id = 1到id = 4检索随机广告。如果随机数恰好为3且id = 3不存在,则横幅广告行中将存在间隙。如果有办法解决这种情况下的巨大差距,请告诉我。提前谢谢

5 个答案:

答案 0 :(得分:4)

只需执行以下SQL查询:

ALTER TABLE `tbl_name` AUTO_INCREMENT = 1;

......但这听起来像是一个糟糕的主意,所以不要这样做。为什么主键的价值如此重要?唯一性更为重要,重置它会破坏它。

答案 1 :(得分:3)

您只能使用

ALTER TABLE 'tbl' AUTO_INCREMENT=#

重置为高于最高值的数字。如果您有1,2,3,并且删除2,则不能使用它来填充2.如果删除3,则可以使用它来重复使用3(假设您没有更高的值)。这是你能做的最好的事情。

答案 2 :(得分:1)

ALTER TABLE 'table' AUTO_INCREMENT = 1;

但是运行此代码不是最好的主意。如果您依赖列没有间隙,那么您的应用程序有问题。你想算一下用户数吗?如果是这样使用COUNT(id)?你在试图处理其他桌子吗?如果是这样,请使用外键。

如果你已经死定了这个错误的方法,你可以尝试寻找最低的免费号码,并自己做增量。但请记住,竞争条件包括在内。

另外,请记住,如果更改数据库中的实际数字,则需要在其他表和代码中更改对它的所有引用。

答案 3 :(得分:0)

你可以通过以下方式做到:

  1. 创建一种机制,在您想要插入时提供下一个可用的ID(例如,涉及在某处读取和递增整数列的事务 - 特别注意事务隔离级别!)
  2. 使用UPDATE递减所有大于您刚刚删除的ID(再次,使用事务 - 不要忘记外键必须是ON UPDATE CASCADE!)
  3. 但它引出了一个问题:你为什么要这样?这是值得的吗?

    几乎可以肯定,如果没有这样的巫术,你可以实现你的目标。

    更新(发表评论):

    要选择随机行数,您可以执行以下操作:在MySQL中

    SELECT id FROM banners ORDER BY RAND() LIMIT 5
    

    选择5个随机的,保证现有横幅ID。

    提醒一句:有很多人将ORDER BY RAND()视为糟糕的表现。然而,恕我直言,将每个案件都放在同一个篮子里是不对的。如果表中的行数是可管理的(我认为任何低于10K的行数都不是那么多)那么ORDER BY RAND()提供了一个非常好的和简单的解决方案。此外,the documentation本身也暗示了这种方法:

      

    但是,您可以检索行   这样的随机顺序:

         

    mysql> SELECT * FROM tbl_name ORDER BY RAND();

         

    ORDER BY RAND()结合   LIMIT对于选择随机非常有用   来自一组行的样本:

         

    的MySQL> SELECT * FROM table1,table2 WHERE a = b AND c ORDER BY RAND()LIMIT 1000;

         

    兰德()并不意味着   完美的随机发生器。它是一个   快速生成随机数的方法   可在两者之间移动的需求   相同MySQL版本的平台。

答案 4 :(得分:0)

好吧,你实际上只需要指定你想要一个记录的id号作为你的insert语句的一部分,例如:

INSERT INTO person VALUES(1,'John','Smith','jsmith@devnull.fake','+19995559999');

如果没有主键冲突(数据库中没有id = 1的记录),那么MySQL将很乐意执行它。

ALTER TABLE 'tbl' AUTO_INCREMENT=#也可以,并且意味着您无需跟踪计数器。

虽然您正在考虑这个问题,但您可能希望阅读有关natural vs surrogate keys的一些讨论。让你的身份#特别重要的想法有点不寻常,可能是设计困难的标志。