mysql 中的auto_increment自增值
1.初始化自增值
默认值是从1开始,在建表时使用“AUTO_INCREMENT=n”可以来指定一个自增的初始值,比如:
CREATE TABLE test( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(15) NOT NULL ) AUTO_INCREMENT=100;
2.重设自增值
alter table table_name AUTO_INCREMENT=n;
说明:
1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
2)把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
3)当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
4)当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况:
情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
情况二,如果插入的值大于已编号的值,则会把该值插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
5)如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错,如果大于已有值,则下一个编号从该值开始递增.
3.修改自增步长
1)查看相关参数
SHOW VARIABLES LIKE 'auto_inc%';
其中,auto_increment_increment是自增的步长,value为1代表每次 1;auto_increment_offset是自增的偏移量,也就是自增开始,value为1代表从1开始增加。
InnoDB自增主键是通过本身的自增计数器获取,该方式会通过表锁机制完成。表锁只有在插入结束后才释放,也就是事务完成后。为了解决自增主键锁表的问题,引入了innodb_autoinc_lock_mode,通过轻量级互斥量的增长机制来完成。
show variables like 'innodb_autoinc_lock_mode';
innodb_autoinc_lock_mode的取值有三种:
- 0,表锁
- 1,默认值,互斥量,会“预申请”多余的值,可能会出现不连续的情况
- 2,自增值不连续,性能好
参数innodb_autoinc_lock_mode = 1时,每次会预申请多余的id(handler.cc:compute_next_insert_id),而insert执行完成后,会特别将这些预留的id空出,就是特意将预申请后的当前最大id回写到表中
最近就发现一次一个数据表由于频繁的insert on duplicate key update导致了表的不连续,具体原因是该数据会预分配id但如果插入失败执行更新操作,那么该id就被废弃了,而下一条插入操作会跳过该值。
应用:
在mysql主主同步时(两台机器互相同步数据),需要设置 auto_increment_increment = 2 , auto_increment_offset = 1 和 2,这样才能避免两台服务器同时做更新时自增字段的值之间的冲突。
参考:https://blog.csdn.net/weixin_39983912/article/details/113131566
2)设置全局变量
方法一:#设置auto_increment_increment自增步长为n,也就是每插入一条数据,就加n,这个N必须是一个数字,默认是1
mysql> SET @@auto_increment_increment=n;
mysql> SET @@auto_increment_offset=m;
如果以上方法还不生效,或者重启mysql后,又变回来了,那肯定是在my.cnf里面设置了全局变量,这个必须到配置文件里面去修改了,这种修改永久有效,而且无法通过上面的操作再次被修改。
方法二:用vi编辑器打开配置文件,默认位置.
#vi /etc/my.cnf
找到 auto_increment_increment 变量设置的地方,VI里面可以用 "/auto_increment_increment" 找到.
找到后设置 auto_increment_increment=1;即可
其他全局变量也可在此配置文件里面永久设置好,配置文件修改好后,要重启mysql服务才会生效.
#/etc/init.d/mysql restart
参考:http://seo.wordc.cn/contentlp.asp?id=203
但目前来看,修改自增步长这一块对我的用处不大,它作用与全局,涉及到所有的数据库和表,所以仅做记录。