首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 自增主键一定是连续

使用 insert into test_pk values(null, 1, 1) 插入一行数据,再执行 show create table 命令来看一下结构定义: 上述结构定义存放在后缀名为....frm 本地文件,在 MySQL 安装目录下 data 文件夹下可以找到这个 .frm 文件: 从上述结构可以看到,定义里面出现了一个 AUTO_INCREMENT=2,表示下一次插入数据时...那么就把这个当前 AUTO_INCREMENT 值填到自增字段; 如果插入数据时 id 字段指定了具体值,就直接使用语句里指定值。...自增值不连续场景 4 对于批量插入数据语句,MySQL 有一个批量申请自增 id 策略: 语句执行过程,第一次申请自增 id,会分配 1 个; 1 个用完以后,这个语句第二次申请自增 id,会分配...举个例子,假设我们现在这个有下面这些数据: 我们创建一个和当前 test_pk 有相同结构定义 test_pk2: 然后使用 insert...select 往 teset_pk2 批量插入数据

3.7K10

软件测试|MySQL主键自增详解:实现高效标识与数据管理

图片简介在MySQL数据,主键自增是一种常见技术,用于自动为主键字段生成唯一递增值。本文深入讨论MySQL主键自增原理、用途、使用方法,以及在实践注意事项和最佳实践。...主键自增主键自增原理主键自增是通过使用AUTO_INCREMENT属性来实现。当在创建主键字段时,将其定义为AUTO_INCREMENT,这将告诉MySQL自动为该字段分配唯一递增值。...每次向插入新记录时,MySQL会自动计算下一个可用自增值,并将其赋给主键字段。通过给字段添加 AUTO_INCREMENT 属性来实现主键自增长。...;在上述示例,id字段被定义为主键,带有AUTO_INCREMENT属性,MySQL会自动为id字段生成唯一递增值。...总结MySQL主键自增是一种简单且高效方法,用于为主键字段自动生成唯一递增值。它提供了方便数据插入和快速数据访问,确保数据唯一性和完整性。

27120
您找到你想要的搜索结果了吗?
是的
没有找到

mysql操作命令梳理(2)-alter(update、insert)

mysql运维操作中会经常使用到alter这个修改命令,alter tables允许修改一个现有结构,比如增加或删除列、创造或消去索引、改变现有列类型、或重新命名列或本身,也能改变注释和类型...下面就针对alter修改命令使用做一梳理: 在mysql运维操作中会经常使用到alter这个修改命令,alter tables允许修改一个现有结构,比如增加或删除列、创造或消去索引、改变现有列类型...; 通过ALTER TABLE 修改初始值(但要大于AUTO_INCREMENT自增值,否则设置无效): mysql>ATLER TABLE AUTO_INCREMENT=100; 如果自增序列最大值被删除了...就是说如果中原本有AUTO_INCREMENT属性值连续为78、100值,但100这个数据被删除了,下此再添加数据时候自增值为101,100被重用了。...即使在你整个所有数据delete清空后,之前自增序列最大值还是会被重用。

1.8K60

关系型数据MySQL 常见几种约束

varchar(20) default “JiekeXu”, loc varchar(40) ); 注:字符串要使用双引号,MySQL 5.5 是可以使用单引号。...3、唯一约束(unique, UK) 当数据某个字段上内容不允许重复时,则可以使用 UK 约束进行设置。即可保证数据值不重复。...) Auto_incrementMySQL 唯一扩展完整性约束,当为数据插入新纪录时,字段上值会自动生成唯一 ID。...在具体设置 AUTO_INCREMENT 约束时,一个数据只能有一个字段使用该约束,该字段数据类型必须是整数类型。...由于设置了AUTO_INCREMENT 约束后字段会生成唯一 ID,所以该字段也经常会设置成 PK 主键。

2.6K20

这次终于懂了,InnoDB七种锁(收藏)

第一种,自增锁(Auto-inc Locks) 【案例说明】 MySQL,InnoDB,默认隔离级别(RR),假设有数据: t(id AUTO_INCREMENT, name); 数据中有数据:...(4)事务A再select: select * from t where id>3; 得到结果是: 4, xxx 6, xxoo 画外音:不可能查询5记录,在RR隔离级别下,不可能读取到还未提交事务生成数据...t(id unique PK, name); 数据中有数据: 10, shenjian 20, zhangsan 30, lisi 事务A先执行,在10与20两条记录插入了一行,还未提交: insert...在MySQL,InnoDB,RR下: t(id unique PK, name); 数据中有数据: 10, shenjian 20, zhangsan 30, lisi 事务A先执行,在10与20两条记录插入了一行...【继续插入,知识铺垫】 InnoDB细粒度锁,是实现在索引记录上,如果查询没有命中索引,也退化为锁。

1.7K40

插入InnoDB自增列,居然是锁?

一,案例说明 MySQL,InnoDB,默认隔离级别(RR),假设有数据: t(id AUTO_INCREMENT, name); 数据中有数据: 1, shenjian 2, zhangsan...(4)事务A再select: select * from t where id>3; 得到结果是: 4, xxx 6, xxoo 画外音:不可能查询5记录,再RR隔离级别下,不可能读取到还未提交事务生成数据...三,自增锁(Auto-inc Locks) 自增锁是一种特殊级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型列。...最简单情况,如果一个事务正在往插入记录,所有其他事务插入必须等待,以便第一个事务插入行,是连续主键值。...t(id unique PK, name); 数据中有数据: 10, shenjian 20, zhangsan 30, lisi 事务A先执行,在10与20两条记录插入了一行,还未提交: insert

72830

IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在问题及最佳实践

此外,由上面的执行过程可知,我们期望插入记录因为唯一键冲突而没有插入成功,但auto_increment字段值却递增了。因为插入语句并未执行成功,因而在binlog并不会有执行记录。...同样auto_increment也发生了递增: 2.2 实现机制 REPLACE运行与INSERT很相像,但当旧记录与新记录发生唯一键冲突时,会在新记录被插入之前,旧记录被删除: 尝试把新行插入...; 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时,从删除含有重复关键字值(所有)冲突行 ; 再次尝试把新行插入 。...2.3 存在问题(数据字段丢失、主从不一致和主键消耗过快) 由其实现机制可知,对于发生唯一键(包括主键)冲突导致插入失败时,会先从删除原冲突行,再尝试把新行插入。...此外,参考博客中提到,MySQL在指定主键(id )进行插入时候,如果这个id大于自增值,那么MySQL会把自增值修改为这个id值加1,但是如果我们把主键更新成更大值,MySQL并不会把自增值修改为更新后

1.6K11

linux 之mysql——约束(constraint)详解

alter table myself drop primary key; 语法:alter table 名 drop primary key;  6、在MySQL数据库提供了一个自增数字,专门用来自动生成主键值...,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_incrementmysql> create table t_user( -> id int(10) primary key...A为基本,B为信息 1、外键涉及术语 外键约束 外键字段 外键值 2、外键约束、外键字段、外键值之间关系 某个字段添加外键约束之后,该字段称为外键字段,外键字段每个数据都是外键值 3、按外键约束字段数量分类...cno(pk) cname 100 1 200 2 为了保证学生classno字段数据必须来自于班级cno字段数据,有必要给学生classno...删除先删除子表数据 插入插入数据 存储学生班级信息  mysql> create table t_class( -> cno int(10) primary key, -> cname

2.4K20

39 | 自增主键不连续

11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`) ) ENGINE=InnoDB; 然后插入数据,最后看到,会自动生成一个AUTO_INCREMENT...值,ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 ,表示下一次插入数据时,如果需要自动生成自增值,会生成 id=11。...自增值修改机制 在插入一行数据时候,自增值行为如下: 如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个当前 AUTO_INCREMENT 值填到自增字段; 如果插入数据时...t2 插入了 4 行数据。...从并发性能角度考虑,我建议你将其设置为 2,同时 binlog_format 设置为 row。我在前面的文章其实多次提到,binlog_format 设置为 row,是很有必要

4.8K10

保存mysql InnoDBauto_increment值另类方案

mysql上述行为说明在mysql运行过程InnoDB存储引擎,其AUTO_INCREMENT值会随着插入操作持续增长,但mysql重启之后,AUTO_INCREMENT值并没有持久保存下来,...重启后再插入数据mysql会以中最大id+1作为当前AUTO_INCREMENT值,新插入数据ID就变为这个了。...当然本质上应避免用mysql这种自增ID作为业务ID,而且应该使用自定义业务ID生成器。 很不幸,我们目前做项目,在设计之初并没有考虑这个问题,因此大量使用这种自增ID作为业务ID。...另类解决方案 要从根源上解决这个问题,当然是使用自定义业务ID来代替mysql这种自增ID,但项目涉及非常多,基于这些数据访问方法也相当多,为了避免大规模修改业务代码,只能想办法规避这个问题...值保存下来 利用插入触发器,在每次插入数据后更新保存auto_increment值 利用init-file参数,在mysql服务启动时调用一个存储过程,该存储过程负责以保存auto_increment

96750

mysql几种锁_初中常见七种沉淀

在statement,目前已经发现不少情况会造成Mysql复制出现问题,主要是修改数据时候使用了某些特定函数或者功能时候会出现,比如:sleep()函数在有些版本中就不能被正确复制,在存储过程使用了...一旦为自动增量列生成了值,无论是否完成“类似INSERT”语句以及包含事务是否回滚,都不能回滚。 这种丢失值不被重用。 因此,存储在AUTO_INCREMENT值可能存在间隙。 3....4)InnoDB AUTO_INCREMENT计数器初始化 如果你为一个Innodb创建了一个AUTO_INCREMENT列,则InnoDB数据字典句柄包含一个称为自动递增计数器特殊计数器,用于为列分配新值...此计数器仅存在于内存,而不存储在磁盘上。 要在服务器重新启动后初始化自动递增计数器,InnoDB将在首次插入包含AUTO_INCREMENT时执行以下语句等效语句。...这个初始化过程使用了一个普通排它锁来读取自增列最大值。InnoDB遵循相同过程来初始化新创建自动递增计数器。

76620

MySQL自增主键id重启后重复使用问题解析

如果在此过程删除部分数据,那么MySQL重启后再插入数据,自增主键ID是否会重复使用呢?本文通过具体示例,解析MySQL自增主键id在重启后是否重复使用问题。...17); 查询表记录,目前应有id从1-14记录: sql SELECT * FROM t; 三、重启MySQL服务插入新记录 接下来重启MySQL服务器,然后插入一条新记录,测试插入记录id...这是因为MySQL会记录下自增id最大值,即auto_increment值,它实际存储在信息架构: sql SHOW TABLE STATUS LIKE 't'\G 我们可以看到,当前auto_increment...MySQL服务器重启后,会读取信息架构auto_increment值,以确定下一个自增id,从而避免了已经使用id重复分配问题。...idIncrement,避免单过大 vivo_tmp_xxx临时可用于生成id,避免影响线上表自增值六、总结MySQL自增主键id在重启后不会重复使用已经删除id,这是由其自动保存恢复auto_increment

35510

MySQL常见七种锁详细介绍

在statement,目前已经发现不少情况会造成Mysql复制出现问题,主要是修改数据时候使用了某些特定函数或者功能时候会出现,比如:sleep()函数在有些版本中就不能被正确复制,在存储过程使用了...一旦为自动增量列生成了值,无论是否完成“类似INSERT”语句以及包含事务是否回滚,都不能回滚。 这种丢失值不被重用。 因此,存储在AUTO_INCREMENT值可能存在间隙。 3....4)InnoDB AUTO_INCREMENT计数器初始化 如果你为一个Innodb创建了一个AUTO_INCREMENT列,则InnoDB数据字典句柄包含一个称为自动递增计数器特殊计数器,用于为列分配新值...此计数器仅存在于内存,而不存储在磁盘上。 要在服务器重新启动后初始化自动递增计数器,InnoDB将在首次插入包含AUTO_INCREMENT时执行以下语句等效语句。...这个初始化过程使用了一个普通排它锁来读取自增列最大值。InnoDB遵循相同过程来初始化新创建自动递增计数器。

89620

SQL笔记(1)——MySQL创建数据

本文详细记录MySQL创建一个数据过程,不只是构建步骤,更多是每一步涉及知识点。...其中,主键列指定了 PRIMARY KEY 约束,强制该列值在唯一,并且使用 AUTO_INCREMENT 关键字,表示该列值会自动递增生成。...其中,主键列指定了 PRIMARY KEY 约束,强制该列值在唯一,并且使用 AUTO_INCREMENT 关键字,表示该列值会自动递增生成。...MySQL约束在开发应用 MySQL约束是一种限制数据某些列值或它们之间关系规则。它可以确保数据完整性和一致性,避免无效或错误数据在存储数据。...然后,我们使用create_all()方法来创建所有的结构,并将其与连接MySQL数据库关联在一起。

3K20

MySQL约束

一 介绍 约束条件与数据类型宽度一样,都是可选参数 作用:用于保证数据完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该主键,可以唯一标识记录 FOREIGN...字段是否有默认值,缺省默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' age int...插入记录 insert into department values (1,'欧德博爱技术有限事业部'), (2,'艾利克斯人力资源部'), (3,'销售部'); #再往子表employee插入记录...这种情况很简单,就是在左foreign key右基础上,外键字段设置成unique即可 三 建立之间关系 #一对多或称为多对一 三张:出版社,作者信息,书 一对多(或多对一):一个出版社可以出版多本书...id外键丈夫id #多对多 三张:出版社,作者信息,书 多对多:一个作者可以写多本书,一本书也可以有多个作者,双向一对多,即多对多    关联方式:foreign key+一张新 ===

4.8K60

生成全局ID

下面以MySQL为例介绍对于在不同机器上生成全局唯一ID几个解决途径,其思想也适用于其他数据库系统。 1....在全局节点上创建一个 在一个全局数据库节点上创建一个带有auto_increment字段,应用就从这个取得唯一性ID。...replace into single_row (col2) values (1); 在这个语句执行后,可以使用MySQLAPI:mysql_insert_id()来获得这个新生成值...这就要求你初始化时,每次都要找出目前在各个数据分块使用最大值,这个过程相当缓慢而且难以自动执行。 4....例如,使用无符号bigint(64位)高8位来保存数据库ID,那么就可以用下面的方式在数据库15上插入11: insert into test(pk_col,...) values ((15<<56

89310

SQL学习笔记三(补充-3)之MySQL完整性约束

,都是可选参数 作用:用于保证数据完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该主键,可以唯一标识记录 FOREIGN KEY (FK) 标识该字段为该外键...字段是否有默认值,缺省默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' age int...主键primary key是innodb存储引擎组织数据依据,innodb称之为索引组织,一张必须有且只有一个主键。...这种情况很简单,就是在左foreign key右基础上,外键字段设置成unique即可 三 建立之间关系 #一对多或称为多对一 三张:出版社,作者信息,书 一对多(或多对一):一个出版社可以出版多本书...id外键丈夫id #多对多 三张:出版社,作者信息,书 多对多:一个作者可以写多本书,一本书也可以有多个作者,双向一对多,即多对多    关联方式:foreign key+一张新 ===

1.5K50

深入浅出锁(Table Lock)

(不然我们直接用普通锁就行了) (一条数据从被锁定被释放过程,可 能存在多种不同锁,但是这里我们只着重表现意向锁) 1....意向锁在保证并发性前提下,实现了 行锁和锁共存且满足事务隔离性 要求  自增锁(AUTO-INC锁) 在使用MySQL过程,我们可以为某个列添加 AUTO_INCREMENT 属性。...这种模式其实就如我们上面的例子,即每当执行insert时候,都会得到一个 级锁(AUTO-INC锁),使得语句中生成auto_increment为顺序,且在binlog重放时候,可以保证master...与slave数据auto_increment是相同。...在这个模式下,“bulk inserts”仍然使用AUTO-INC级锁,保持语句结束。这适用于所有INSERT ... SELECT,REPLACE ...

91740

约束

一 介绍 约束条件与数据类型宽度一样,都是可选参数 作用:用于保证数据完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该主键,可以唯一标识记录 FOREIGN...字段是否有默认值,缺省默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' age int...插入记录 insert into department values (1,'欧德博爱技术有限事业部'), (2,'艾利克斯人力资源部'), (3,'销售部'); #再往子表employee插入记录...,子表employee对应记录跟着删 mysql> delete from department where id=3; mysql> select * from employee; +----+-...,子表employee对应记录跟着改 mysql> update department set id=22222 where id=2; mysql> select * from employee;

2.3K80

你需要了解关于MySQL知识点,都列在这里了!

本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际关于innodb锁相关知识及加锁方式很多,所以没有那么多精力罗列所有场景下加锁过程加以分析,仅根据现在了解知识...lock,所以事务B插入10(包括)30(不包括)之间记录都会阻塞。...后执行,也在10与20两条记录插入了一行: insert into t values(12, ooo); 因为是插入操作,虽然是插入同一个区间,但是插入记录并不冲突,所以使用插入意向锁,此处A...最简单情况,如果一个事务正在往插入记录,所有其他事务插入必须等待,以便第一个事务插入行,是连续主键值。...举个例子(依然是如上例子lock_example),但是id为AUTO_INCREMENT数据数据为: 1, zhangsan 2, lisi 3, wangwu 事务A先执行,还未提交:

85510
领券