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

mysql 主键增语句_MySQL 主键

以下仅考虑 InnoDB 存储引擎。 主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除。...MySQL 5.7 及之前的版本,主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...之所以事务 A 没提交的情况下,事务 B 就能执行插入语句,跟 InnoDB 的增长锁(AUTO-INC Locking)相关。...参考文档 为什么 MySQL主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

mysql主键增策略_MySQL 主键机制

主键:特指在增列上定义的主键主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 增值保存在哪? 不同的存储引擎保存增值的策略不一样; a....对于MyISAM引擎,增值保存在数据文件中; b. Innodb引擎,mysql5.7之前,增值保存在内存中,而且不会持久化增值。...每次重启后第一次打开表,都会去查找增值的最大值max(id), 并设置表当前增值为max(id) + 1; mysql8.0, 增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...增值修改发生在插入数据的操作之前,如果插入失败,增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少增id锁带来的性能影响,mysql不会修改回去之前的增值; 4....:语句执行过程中,第一次申请增 id,会分配 1 个;1 个用完以后,这个语句第二次申请增 id,会分配 2 个;2 个用完以后,还是这个语句,第三次申请增 id,会分配 4 个;依此类推,同一个语句去申请

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

Oracle实现主键增长的几种方式

使用SQLServer、MySQL时,无论我们使用的是直接JDBC连接数据库,还是通过Hibernate操纵数据库,我们只需要设置一个选项或者一行注解便可以实现主键增长。...但Oracle没有直接提供主键增长的功能,这里我们可以使用两种方式来解决主键增长的问题。 第一种,通过序列以及触发器实现主键增长。 这种方式适用于直接使用JDBC连接数据库。...这种方式将主键增长的任务完全交给数据库,我们无需在代码层面上进行任何控制。 第二种,通过序列以及Hibernate配置实现增长。 这种方式适用于通过Hibernate连接数据库的方式。...这两种方式都是通过Oracle的序列实现增长,但第一种通过数据库的触发器在插入的时候自动插入主键。而后者则由Hibernate自动完成获取主键,插入主键这一操作。...一、通过序列以及触发器实现主键增长 首先,为每个表创建一个序列: 1 /* 创建序列 */ 2 --为bitinfo表的主键创建序列 3 create sequence bitinfo_id_seq

1.5K20

MySQL 约束与增长

# MySQL 约束与增长 mysql约束 基本介绍 primary key(主键)-基本使用 not null和unique(唯一) foreign key(外键) check 商店售货系统表设计案例...增长 增长基本介绍 增长使用细节 # mysql约束 # 基本介绍 约束用于确保数据库的数据满足特定的商业规则。...# 增长基本介绍 # 增长使用细节 一般来说增长是和primary key配合使用的 增长也可以单独使用[但是需要配合一个unique] 增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用...) 增长默认从1开始,你也可以通过如下命令修改altertable表名auto increment=新的开始值; 如果你添加数据时,给增长字段(列)指定的有值,则以指定的值为准,如果指定了增长,一般来说...,就按照自增长的规则来添加数据 -- 演示增长的使用 -- 创建表 CREATE TABLE t24( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR

3K30

MyCat教程【全局序列号-全局主键增长

,此时肯定不能使用单个数据库中id增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现 全局主键增 一、本地文件增方式   首先我们来看下第一种方式,也就是本地文件增方式...修改分片策略   我们原来配置的分片策略crc32slot是不支持主键增的,所以我们需要修改为auto-sharding-long ? 2....修改server.xml文件   server.xml文件中的sequnceHandlerType是用来配置主键生成类型的 sequnceHandlerType值 说明 0 本地文件增方式 1 数据库增方式...生成成功~ 三、数据库增方式 1.创建序列表和相关函数   第三种方式是在Mycat所管理的某个数据库中创建一张增的表结构来维护相关的数据,相关的脚本官方提供的有,如下: DROP TABLE IF...主键的生成成功,除了这三种方式以外还可以通过`zookeeper`来维护增的主键,这个可以自行实现

1.5K20

MySQL主键详解「建议收藏」

不同的引擎对于增值的保存策略不同 1.MyISAM引擎的增值保存在数据文件中 2.InnoDB引擎的增值,在MySQL5.7及之前的版本,增值保存在内存里,并没有持久化。...出现了主键不连续的情况 唯一键冲突和事务回滚都会导致主键id不连续的情况 四、增锁的优化 增id锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 但在MySQL5.0版本的时候...所以,增锁直到语句执行结束才释放,就是为了达到这个目的 2)在binlog里面把插入数据的操作都如实记录进来,到备库执行的时候,不再依赖于主键去生成。...有一个批量申请增id的策略: 1.语句执行过程中,第一次申请增id,会分配1个 2.1个用完以后,这个语句第二次申请增id,会分配2个 3.2个用完以后,还是这个语句,第三次申请增id,会分配4...之后,再执行insert into t2 values(null, 5,5),实际上插入了的数据就是(8,5,5) 这是主键id出现增id不连续的第三种原因 五、主键用完了 主键字段在达到定义类型上限后

5.8K40

MySQL主键值回溯问题

平时我们使用MySQL时,通常每一个表都会有一个主键ID,每新增一条数据,ID值就会增1。但在8.0之前版本的MySQL中,这个增值会存在一个回溯的问题。...例如,在一个新表中插入三条主键为1、2、3的数据行,这时候用SHOW CREATE TABLE命令查看该表的AUTO_INCREMENT的值是4,这是没问题的。...但如果重启一下MySQL,这个值就会变回3,而不是4,发生了回溯。...这是因为AUTO_INCREMENT的值只存储于内存中,不会持久化到磁盘,每次启动数据库时,MySQL会通过计算max(auto_increment字段) + 1,重新作为该表下一次的主键ID的增值。...这个问题直至MySQL 8.0才修复。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149188.html原文链接:https://javaforall.cn

4.1K20

MySQL存储过程_MySQL创建存储过程

什么是存储过程 存储过程就是事先经过编译并存储在数据库中的一段 SQL 语句的集合; 为什么使用存储过程 调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的...如果将这些sql操作封装在存储过程中,只需网络交互一次可能就可以了; 存储过程基础语法 1、创建存储过程语法 CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) BEGIN --...([ 参数 ]); 调用上面的存储过程 call p1(); 3、查看存储过程 SHOW CREATE PROCEDURE 存储过程名称 ; -- 查询某个存储过程的定义 4、删除存储过程 DROP...delimiter 指定SQL语句的结束符 存储过程中的变量 在MySQL中,变量一般可分为分为三种类型: 系统变量、用户定义变量、局部变量; 一、系统变量 系统变量是MySQL服务器系统自身提供的...循环语句在编程中经常被用到,常用于对批量的数据进行循环处理,在mysql存储过程中,也提供了几种常用的循环语句,包括:while循环,repeat循环,和loop循环; 1、while循环语句 while

22.2K21

MySQL列属性之增长

歌曲为:《路》-藤竹京 增长 增长:当对应的字段不给值(NULL)或者给默认值时,该字段会自动的被系统触发,系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段。...增长通常是跟主键搭配。 新增增长 任何一个字段要做增长必须前提是本身是一个索引(key一栏有值)。 增长字段必须是数字(整型) 一张表最多只能有一个增长,和主键一起搭配。...', name varchar(10) not null )charset utf8;-- 正确 增长使用 当增长被给定的值为NULL,或者默认值的时候会触发自动增长。...如上图运行结果可知: 1.增长起始为1,且每次加1。 2.增长如果对应的字段输入了值,那么增长失效,但是下一次还是能够正确的增长,即值加1。...修改自增长 增长如果是涉及到字段改变,则必须先删除增长,后增加,因为一张表有且只能有一个增长。 修改当前增长已经存在的值:修改只能比当前已有的增长的最大值大,不能小,否则不会生效。

4.6K20

MySQLMySQL 存储过程

MySQL 存储过程(了解) 1 什么是存储过程 MySQL 5.0 版本开始支持存储过程 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据 库对象。...存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过 指定存储过程的名字并给定参数(需要时)来调用执行。 简单理解: 存储过程其实就是一堆 SQL 语句的合并。...中间加入了一些逻辑控制 2 存储过程的优缺点 优点:   存储过程一旦调试完成后,就可以稳定运行,(前提是,业务需求要相对稳定,没有变化)   存储过程减少业务系统与数据库的交互,降低耦合...,数据库交互更加快捷(应用服务器,与 数据库服务器不在同一个地区) 缺点:    在互联网行业中,大量使用MySQLMySQL存储过程与Oracle的相比较弱,所以较少使用,并且互联网行业需求变化较快也是原因之一...goods; END $$ 3) 调用存储过程 语法格式 call 存储过程名 -- 调用存储过程 查询goods表所有数据 call goods_proc; 方式2 1) IN 输入参数:表示调用者向存储过程传入值

16K10

mysql为什么建议使用主键

我们都知道表的主键一般都要使用增 id,不建议使用业务 id ,是因为使用增 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...然后 mysql 在底层又是以数据页为单位来存储数据的,一个数据页大小默认为 16k,当然你也可以自定义大小,也就是说如果一个数据页存满了,mysql 就会去申请一个新的数据页来存储数据。...如果主键增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...这就造成了页分裂,这个大量移动数据的过程是会严重影响插入效率的。

4.9K31

MySQL主键为什么不连续

主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 主键保存在何处?...不同的引擎对于增值的保存策略不同: MyISAM引擎的增值保存在数据文件中 InnoDB引擎的增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,增值没有持久化每次重启后第一次打开表的时候...,会找增值的最大值max(id),然后将最大值加1作为这个表的增值;MySQL8.0版本会将自增值的变更记录在redo log中,重启时依靠redo log恢复。...1 继续执行插入数据操作,但是由于c=1的记录已经存在,所以会返回Duplicat key error,语句返回 上述执行过程可以看出,增值的修改是在真正插入数据的操作之前,如果数据真正插入的时候异常...有一个批量申请增id的策略: 语句执行过程中,第一次申请增id,分配1个 1个用完以后,第二次申请,会分配2个 2个用完以后,第三次申请,会分配4个 依此类推,每次申请都是上一次的两倍(最后一次申请不一定全部使用

8.3K20

MySQL 存储过程

1.1 简介 1.1.1 概述   MySQL 5.0 版本开始支持存储过程存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。...存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。...④ 存储过程可以用在数据检验,强制实行商业逻辑等。 ☞ 缺点  ① 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他的数据库系统时,需要重写原有的存储过程。  ...1.2 存储过程的使用 1.2.1 创建存储过程 ☞ 语法 create procedure 存储过程名([参数模式] 参数名 参数类型) begin # 变量定义 declare name type...1.2.3 调用存储过程 ☞ 语法 call 存储过程名称(参数列表); ☞ 示例 mysql> call showtest; +----+-------+ | id | money | +----+-

13.3K31

MySQL存储过程

文章目录 创建/调用存储过程 存储过程体 为语句块贴标签 参数列表 存储过程的优缺点 存储过程的优点 存储过程的缺点 存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。...创建/调用存储过程 create procedure 存储过程名(参数列表) begin 存储过程体 end 例如: delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义...因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null +-------+ | p_out | +-------+ | 2 | +-------+ mysql>...存储过程的优缺点 存储过程的优点 1.第一点优势就是执行速度快,因为我们的每个sql语句执行都需要经过编译,然后在运行,但是存储过程都是直接编译好了之后直接运行即可 2.第二点优势就是减少网络流量,我们传输一个存储过程比我们传输大量的...因为我们在写好一个存储过程之后,再次调用只需要一个名称即可,也就是一次编写,随处调用,而且使用存储过程也可以让程序的模块化加强 存储过程的缺点 1.移植性差。

10.1K30

MySQL存储过程

MySQL存储过程 存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。...MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT: IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT:该值可在存储过程内部被改变...注释 MySQL存储过程可使用两种风格的注释: 双杠:--,该风格一般用于单行注释 C风格: 一般用于多行注释 MySQL存储过程的调用 用call和你过程名以及一个括号,括号里面根据需要,加入参数...数据库.存储过程名; MySQL存储过程的修改 ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程存储功能。...PROCEDURE [过程1[,过程2…]] 从MySQL的表格中删除一个或多个存储过程

13.7K30

MySQL主键增值为什么有“空洞”?

最终发现了MySQL主键增值“空洞”了 1.场景准备 测试场景为MySQL 8.0: 主键重复场景 唯一键重复场景 1、建表,包含主键及唯一约束 CREATE TABLE t1( id int(...key 't1.uk_c1' insert ignore into insert方式插入数据在处理过程中发生主键传统等错误时候,语句会被终止,并告知错误的原因。...t1.uk_c1' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) 在测试过程中惊奇的发现测试表中的主键增列发生了改变...3.问题分析 为了更好地理解,首先让我们具体认识一下AUTO_INCREMENT属性在不同的存储引擎当中,其增值的保存策略有所不同: MyISAM引擎的增值是保存在数据文件中的。...business=space_collection&business_id=343928&desc=0 ---- 文章推荐: MySQL 8.0有趣的新特性:CHECK约束 MySQL 启停过程了解一二

2.2K20
领券