在MySQL中删除后自动递增

Omi*_*uri 64 mysql sql primary-key auto-increment

我有一个MySQL表,主键字段打开AUTO_INCREMENT.在阅读了这里的其他帖子之后,我注意到有相同问题并且答案各不相同的人.有人建议不要使用此功能,其他人说它不能"修复".

我有:

table: course
fields: courseID, courseName
Run Code Online (Sandbox Code Playgroud)

示例:表中的记录数:18.如果我删除记录16,17和18 - 我希望输入的下一条记录的课程ID为16,但是它将是19,因为最后输入的课程ID是18.

我的SQL知识并不令人惊讶,但无论如何使用查询(或phpMyAdmin界面中的设置)刷新或更新此计数?

该表将与数据库中的其他表相关.


鉴于所有的建议,我决定忽略这个'问题'.我将简单地删除并添加记录,同时让自动增量完成它的工作.我想这个数字到底是什么并不重要,因为它只被用作唯一标识符,并且没有(如上所述)商业含义.

对于那些我可能与我的原帖混淆的人:我不想用这个字段来知道我有多少记录.我只是希望数据库看起来整洁,并且具有更多的一致性.

Dol*_*lph 67

你想要做的事情听起来很危险,因为这不是预期的用途AUTO_INCREMENT.

如果您确实想要找到最低的未使用键值,请不要使用AUTO_INCREMENT,并手动管理您的键.但是,这不是推荐的做法.

退后一步,询问" 为什么需要回收键值? "未签名INT(或BIGINT)是否提供足够大的密钥空间?

18,446,744,073,709,551,615在应用程序的生命周期中,您真的会拥有超过独特的记录吗?

  • 由于多种原因同意高度危险.其一,在多用户系统中,您每秒可能会有数百,数百,数千次更新,并且尝试重写auto inc可能会降低系统速度或使其受损.另外两个开发人员不会知道你这样做或者通过id链接记录来破坏系统.等等 (3认同)
  • 你是对的。最好忽略它。考虑到这只是为了一项任务,我不会涉及太多数字,而且生命周期很短。 (2认同)

mon*_*ksp 35

ALTER TABLE foo AUTO_INCREMENT=1
Run Code Online (Sandbox Code Playgroud)

如果您删除了最新的条目,则应将其设置为使用下一个最低条目.如同,只要没有19,删除16-18将重置自动增量使用16.


编辑:我错过了关于phpmyadmin的一点.你也可以在那里设置它.转到表格屏幕,然后单击"操作"选项卡.那里有一个AUTOINCREMENT字段,您可以手动设置任何需要的字段.

  • 我不是告诉他如何布置他的数据库,或者如何做他的业务逻辑的地方.他还在帖子中提到他读过其他帖子/页面,说明这是一个坏主意,所以他知道这不是推荐的做法,但无论如何都要继续. (10认同)
  • 这是目前提供给提问者唯一明确问题的最直接的答案.没有涉及"建议". (5认同)
  • 虽然**这是一个不好的做法,但它是最好的答案,因为它*实际上回答了OP所要求的内容 (4认同)

Dar*_*rov 16

数据库中的主要自动增量键用于唯一标识给定行,不应给出任何业务含义.因此,保持主键不变,并添加另一个名为例如的列courseOrder.然后,当您从数据库中删除记录时,您可能希望发送一个额外的UPDATE语句,以便减少courseOrder所有courseOrder大于您当前正在删除的行的列.

作为旁注,您永远不应该修改关系数据库中主键的值,因为可能有其他表将其作为外键引用,并且修改它可能违反引用约束.


小智 10

试试:

SET @num:= 0;

UPDATE your_table SET id = @num:=(@ num + 1);

ALTER TABLE tableNameAUTO_INCREMENT = 1;

这将重置自动增量值,然后在为其创建新值时计算每一行.

例子:之前

  • 1:这里的第一个值
  • 2:这里的第二个值
  • X:删除值
  • 4:表的其余部分
  • 5:剩下的剩下的......

所以表格将显示数组:1,2,4,5

示例:AFTER(如果您使用此命令,您将获得)

  • 1:这里的第一个值
  • 2:这里的第二个值
  • 3:表的其余部分
  • 4:其余的休息

没有删除值的痕迹,其余的增量继续使用此新计数.

  1. 如果您的代码中某处使用了自动增量值......也许这种归因会导致问题.
  2. 如果你不在代码中使用这个值,一切都应该没问题.