-- Mysql 自增序列字段(AUTO_INCREMENT)起始值设置,步长设置,跳跃增长问题,按行号修改问题.
【官网】:https://www.mysql.com/
应用场景
在mysql的自增列使用比较常见,但常会遇到一些问题,怎么处理呢,本文进行一个相关的汇总: 怎么设置起始值,为什么出现跳跃增长(不连续的问题), 怎么修改不连续的增长序列值(考虑到业务上的唯一性,这个不提倡,但特殊情况可能用上)基础资源
mysql
使用须知
强烈建议需要根据业务场景设计是否使用自增序列,未来数据量的规模,是否有插入异常,什么类型的数据库引擎(MyISAM ,Innodb..)等来综合考虑相关问题。
配置步骤
A)怎么设置自增列的起始值 ,增长步长(每次增加的大小).
`CreateTime` datetime not null,
`CreateUserId` int(11) not null,
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;
[注]红色部分的 "AUTO_INCREMENT=1000"就是确定自增列的起始值。
如果需要的是每次序列增长10,而不是默认增长1,则可以指定:
在指定AUTO_INCREMENT=1000的基础上增加 auto_increment_increment=10
B)为什么自增列出现跳跃增长(序列值不连续)?
只要mysql 实例服务运行,InnoDB 就会使用内存中自动递增计数器。当mysql服务停止并重新启动时,InnoDB 重新初始化每个表的计数器,以便对表进行第一次 INSERT。
mysql服务重启还会取消 CREATE TABLE 和 ALTER TABLE 语句中 AUTO_INCREMENT = N 表选项的效果,您可以将其与 MySQL 5.0.3 的 InnoDB 表一起使用,以设置初始计数器值或更改当前计数器值。
如果您使用计数器回滚已生成数字的事务,您可能会看到分配给 AUTO_INCREMENT 列的值序列中的间隙(也就是不连续) 。
换一句话说:Innodb存储引擎的auto_increment计数器是随着mysql-server启动开始分配,并一直缓存在内存中。当插入数据失败或者回滚事务时,内存中的auto_increment计算器的值却不会回滚,因此比如失败了10000次,那么会跳跃一万的序列值增长幅度。
[注1:最常见的问题]
Duplicate entry ‘X‘ for key ‘UNIQUE_Key_...‘ 遇到唯一键约束冲突后导致插入失败,此时自增序列值已经用了,下一次会从错误的开始继续增加1,中间出现了跳跃(不连续的现象了).
[注2:如何修复自增列不连续的问题]
2.1)如果条件允许可以将该表引擎从Innodb改为MyISAM.
2.2)寻找sql执行失败的原因并增加校验,修复问题。
[官网资料]https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
C)业务场景允许的情况下,如何修复自增列不连续的问题以达到连续.
思路:按照id或者时间按从小到大排序=>获取行号=>用行号替换原id
sql:
update tab as t1 join (select id,(@rowno:=@rowno+1) as rowno from tab a,(select (@rowno:=0)) b order by a.id) as t2 SET t1.id=t2.rowno WHERE t1.id=t2.id;
D)数据表中归档或清理了无用的老数据后,如何让自增列的起始值重置为1?
1)危险的骚操作(需要业务场景和公司情况允许 )。
truncate table 你的表名 //清除数据,而且可以重新位置identity属性的字段
2)ALTER TABLE user AUTO_INCREMENT = n; //需要确保n大于目前表中最大的序列值。
常见问题
-
自增列的值出现不连续怎么办
【解决方案】1)如果条件允许可以将该表引擎从Innodb改为MyISAM. 2)寻找sql执行失败的原因并增加校验,修复问题。
快速入门
无