首页 > 数据库 >mysql 中的auto_increment自增值

mysql 中的auto_increment自增值

时间:2023-01-04 14:13:11浏览次数:61  
标签:自增 increment auto 插入 INCREMENT mysql AUTO

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

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

标签:自增,increment,auto,插入,INCREMENT,mysql,AUTO
From: https://www.cnblogs.com/mianbaoshu/p/17024666.html

相关文章

  • 使用 DataX 实现 MySQL 数据的高效同步
    使用DataX实现MySQL数据的高效同步发布于2022-07-1816:07:19阅读 5590 本周赠书《性能之巅》第2版我们公司有个项目的数据量高达五千万,但是因为报表那......
  • mysql 授权远程访问
    进入mysql命令1.进入cd/usr/local/mysql/bin下执行./mysql-uroot-pInfosec@2020 (-p后面是数据库密码)2.usemysql;3.updateusersethost='%'whereuser='r......
  • MySQL最大建议行数2000W?老司机做了个实验……
      一、背景 作为在后端圈开车的多年老司机,是不是经常听到过,“mysql单表最好不要超过2000w”,“单表超过2000w就要考虑数据迁移了”,“你这个表数据都马上要到20......
  • mysql索引简谈
                           mysql索引简谈 一、什么是索引就好比我们在看一本书的时候,有目录的话,我们可以快速定位到想看......
  • 【MySQL】谈谈锁的类型
    前言MySQL中的锁分为表锁以及行锁,从字面意思就可以得知,表锁是对一整张表进行加锁,而行锁是针对于特定的行。在Server层面,提供了表锁的实现,而行锁则由存储引擎实现。Innodb......
  • 变分自编码器 - VAE: Variational Auto-Encoder
    总之,VAE本身是一个生成模型,我们假设观测的某个变量\(\mathbf{x}\)(比如数字0~9的各种图像)受到隐变量\(\mathbf{z}\)的影响,那么在得到分布后,只需要采样得到一个\(\mat......
  • Ubuntu 安装MySQL 并 重置root密码
    注:如果不是root用户,命令前需加上sudo1、安装MySQLapt-getinstallmysql-server如果报错则更新源 apt-getupdate  2、安装好MySQL后,启用MySQL servicemysql......
  • 使用ansible-playbook自动化安装MySQL主从
    【使用自动化安装MySQL主从架构】说明:使用ansible-playbook 自动化安装MySQL主从+ mysqld-exporter的采集数据+ xtrabackup备份【剧本说明】以下文件在roles目录......
  • 通俗易懂的MySQL事务及MVCC原理,我先收藏了!
    一、事务简介与四大特性事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败。由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的。事务具有以下四......
  • 使用pymysql连接数据库,插入报错:You have an error in your SQL syntax; check the manu
    问题YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear"xx"==...问题描述......