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的取值有三种:

  1. 0,表锁
  2. 1,默认值,互斥量,会“预申请”多余的值,可能会出现不连续的情况
  3. 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

但目前来看,修改自增步长这一块对我的用处不大,它作用与全局,涉及到所有的数据库和表,所以仅做记录。

posted @ 2023-01-04 14:00  声声慢43  阅读(2163)  评论(0编辑  收藏  举报