设置自增初始值和步长

通过:SHOW VARIABLES LIKE 'auto_inc%'; 查看当前数据库的自增长设置。

auto_increment_increment这是自增长的步长。

auto_increment_offset这是自增长开始的值。

现在想要更改test表的id增长开始值和增长的步长,可以使用如下方法:

SET @@auto_increment_increment=3; – 将自增长步长设置为3

SET @@auto_increment_offset=4; – 将自增长开始值设置为4

但是这样设置的话, Mysql重启之后, 设置会消失, 所以我们需要在配置文件中修改

Mysql的配置文件, my.ini或者my.cnf

查找配置文件: whereis my.cnf

或者:查看Mysql默认读取my.cnf的目录

命令
mysql --help|grep 'my.cnf'

输出
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

/etc/my.cnf, /etc/mysql/my.cnf, /usr/local/etc/my.cnf, ~/.my.cnf 这些就是mysql默认会搜寻my.cnf的目录,顺序排前的优先。

启动时没有使用配置文件
如果没有设置使用指定目录my.cnf文件及默认读取目录没有my.cnf文件,表示mysql启动时并没有加载配置文件,而是使用默认配置。

如果需要修改配置,可以在mysql默认读取的目录中,创建一个my.cnf文件(例如:/etc/my.cnf),把需要修改的配置内容写入,重启mysql后即可生效.

问题

查看一下结果,看是不是我们期望的值:

img

通过结果可以看到:从第二行开始,确实符合我们的设置。

但是:id是从3开始的,这与我们的设置并不一样,我们设置的为从4开始,怎么回事?怎么解决?

其实auto_increment在使用时,会对初始值与添加了auto_increment语法的列中的值进行比较,当 auto_increment的当前值(此处值是2)小于 添加了该语法的列的值时,auto_increment会拿当前值2 根据步长(2)递增,知道auto_increment的当前值大于添加了该语法的列(id)的值时,才会将最终的这个值作为初始插入数据的值。

auto_increment 在插入数据时,真正一开始可以插入表中的值得计算公式:

假设 a 为 表中id列的最大值, b为auto_increment的初始值,c 为步长,则auto_increment真正的初始值为:

auto_increment_real = int( a/b) * c + c ;

解决

研究了很久,翻看 MySQL 官网文档,都说,自增ID分别是 1、2、3 和 2 、 4 、 6 ,并没有对此情况做明确说明。
直到我看到 这位大神的回答。其实id的计算: INT(current_value / increment) x increment + offset.

总结

总结一下:

  1. AUTO_INCREMENT 所在的列,必须为整数型数据列
  2. AUTO_INCREMENT 所在的列,不能为空
  3. AUTO_INCREMENT 所在的列,必须有唯一索引
  4. AUTO_INCREMENT 所在的列,值必须大于0
  5. AUTO_INCREMENT 所在的列,最大值,受其数据类型及是否为 无符号(Unsigned) 限制,若使用的为 TINYINT(4) 且 为无符号的,则最大值为 255,若继续插入数据,则该列的值保持最大值不变,
  6. AUTO_INCREMENT 所在的列,若向其中插入的值,大于所在表当前的 AUTO_INCREMENT 值,则会更新表 AUTO_INCREMENT 值至 current_max_value - (current_max_value - auto_increment_offset) % auto_increment_increment + auto_increment_increment ,即该列的下一个序列值