好的,我们假设我有一个包含两列的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不存在,则横幅广告行中将存在间隙。如果有办法解决这种情况下的巨大差距,请告诉我。提前谢谢
答案 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)
你可以通过以下方式做到:
UPDATE
递减所有大于您刚刚删除的ID(再次,使用事务 - 不要忘记外键必须是ON UPDATE CASCADE!)但它引出了一个问题:你为什么要这样?这是值得的吗?
几乎可以肯定,如果没有这样的巫术,你可以实现你的目标。
更新(发表评论):
要选择随机行数,您可以执行以下操作:在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的一些讨论。让你的身份#特别重要的想法有点不寻常,可能是设计困难的标志。