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

mysql语句的主键自增长

基础概念

MySQL中的主键(Primary Key)是表中的一个或多个字段,用于唯一标识表中的每一行数据。主键具有以下特性:

  1. 唯一性:主键的值在表中必须是唯一的。
  2. 非空性:主键的值不能为空。
  3. 唯一索引:主键字段上会自动创建一个唯一索引,以提高查询效率。

自增长(AUTO_INCREMENT)是MySQL提供的一种特性,用于在插入新记录时自动为某个字段生成唯一的递增值。通常与主键结合使用,以确保每条记录都有一个唯一的标识符。

相关优势

  1. 简化插入操作:无需手动为每条记录分配唯一标识符,系统会自动生成。
  2. 保证唯一性:自增长字段确保每条记录的标识符都是唯一的。
  3. 提高查询效率:主键上的唯一索引可以提高查询效率。

类型

MySQL中的主键自增长通常用于整数类型的字段,如INTBIGINT等。

应用场景

主键自增长广泛应用于需要唯一标识符的场景,例如:

  • 用户表:每个用户需要一个唯一的用户ID。
  • 订单表:每个订单需要一个唯一的订单号。
  • 商品表:每种商品需要一个唯一的商品编号。

示例代码

以下是一个创建带有自增长主键的表的示例:

代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

在这个示例中,id字段被定义为主键,并且具有自增长特性。

常见问题及解决方法

问题1:自增长主键值跳跃

原因:当删除表中的记录时,自增长主键的值不会回退,而是继续递增。

解决方法

  1. 手动设置自增长值
  2. 手动设置自增长值
  3. 使用逻辑删除:在表中添加一个deleted字段,标记记录是否被删除,而不是物理删除记录。

问题2:自增长主键溢出

原因:当自增长主键的值达到其数据类型的最大值时,将无法继续递增。

解决方法

  1. 更改数据类型:将自增长主键的数据类型从INT改为BIGINT
  2. 更改数据类型:将自增长主键的数据类型从INT改为BIGINT
  3. 重置自增长值:定期检查并重置自增长值,避免溢出。
  4. 重置自增长值:定期检查并重置自增长值,避免溢出。

参考链接

希望以上信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql 主键语句_MySQL 主键

MySQL 5.7 及之前版本,主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算...从 MySQL 8.0 开始,主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里值。...主键插入时连续性 这里不考虑由于删除导致连续性问题 为何会有连续性问题? 这主要是跟插入事务回滚有关系。 对于两个插入事务,事务 A 先执行插入语句,之后事务 B 执行插入语句。...之所以事务 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....而对于批量插入数据语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请增 id 策略(注:该策略是导致增 id 不连续第三种原因

    9.5K50

    Oracle实现主键增长几种方式

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

    1.6K20

    mysql主键设置

    mysql主键设置 在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段主键值。可以通过为表主键添加AUTO_INCREMENT关键字来实现。...默认情况下,在MYSQL中AUTO_INCREMENT初始值是1,每新增一条记录,字段值自动加1.一个表只能有一个字段属用AUTO_INCREMENT约束,且该字段必须为主键一部分。...AUTO_INCREMENT约束字段可以是任何整数类型(TINTINT、SMALLINT、INT、BIGINT等) 设置表属性值自动增加语法规则如下: 字段名 数据类型 AUTO_INCREMENT...int(11) PRIMARY KEY auto_increment, name VARCHAR(25) not null, deptId int(11), salary FLOAT ); 执行插入语句...insert into tb_emp8(name,salary) values('lucy',1000),('lura',1200),('kevin',1500); 查看数据表 在这里并没有输入id

    11.1K30

    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

    3.1K30

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

    ,那么这就涉及到了主键维护问题,此时肯定不能使用单个数据库中id方式来处理了,这时我们就可以通过MyCat中提供几种增长方式来实现 全局主键增 一、本地文件增方式   首先我们来看下第一种方式...修改分片策略   我们原来配置分片策略crc32slot是不支持主键,所以我们需要修改为auto-sharding-long ? 2....修改server.xml文件   server.xml文件中sequnceHandlerType是用来配置主键生成类型 sequnceHandlerType值 说明 0 本地文件增方式 1 数据库增方式...GLOBAL.MAXID=20000 GLOBAL.CURID=10002 GLOBAL.MINID=10001 可以自行设置 4.测试实现 插入语句主键字段用next value for MYCATSEQ_GLOBAL...主键生成成功,除了这三种方式以外还可以通过`zookeeper`来维护主键,这个可以自行实现

    1.6K20

    MySQL主键详解「建议收藏」

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

    5.9K40

    MySQL主键值回溯问题

    大家好,又见面了,我是你们朋友全栈君。 平时我们使用MySQL时,通常每一个表都会有一个主键ID,每新增一条数据,ID值就会增1。...但在8.0之前版本MySQL中,这个增值会存在一个回溯问题。...例如,在一个新表中插入三条主键为1、2、3数据行,这时候用SHOW CREATE TABLE命令查看该表AUTO_INCREMENT值是4,这是没问题。...然后把ID=3数据行删掉,再次查询AUTO_INCREMENT值,依然是4,这也是没问题。 但如果重启一下MySQL,这个值就会变回3,而不是4,发生了回溯。...这是因为AUTO_INCREMENT值只存储于内存中,不会持久化到磁盘,每次启动数据库时,MySQL会通过计算max(auto_increment字段) + 1,重新作为该表下一次主键ID增值。

    4.2K20

    MySQL 主键增注意事项

    很多小伙伴应该知道,在 MySQL主键不应该使用随机字符串。但是主键不用随机字符串用什么?主键增?主键增就是最佳方案吗?有没有其他坑?今天我们就来讨论下这个话题。 1....为什么不用 UUID 经过上篇文章介绍,我们知道在 MySQL 中,主键索引就是聚簇索引,MySQL 表中数据是根据主键值聚集在一起,聚簇索引是一棵 B+Tree,这棵树中数据是有序。...基于上面的分析,我们在 MySQL 中尽量不使用 UUID 作为主键,不用 UUID,可能会有小伙伴想到,那我使用主键增行不行?...SQL 语句开始时候,获取到一个表级 AUTO-INC 锁,然后当插入 SQL 执行完毕之后,再释放掉这把锁,这样做好处是可以确保在批量插入时候,主键是连续。...mixed:在这种模式下,MySQL 会根据具体 SQL 语句来决定日志形式,也就是在 statement 和 row 之间选择一种。

    10410

    MySQL增长属性中

    01 MySQL增长属性中锁 我们在设计表结构时候,经常会对某一列设置增长值,它作用是可以帮助我们自动递增某一列值,增长属性经常被设置在主键列上,原因是主键必须具有唯一性,而自动增长可以避免重复...除此之外,增长属性还可以避免在数据插入时候,出现大量数据页分裂操作,关于这一点,后面说到索引时候,会着重介绍,现在我们只需要知道,主键一般设置成增长即可。...关于增长属性,这里我多唠叨一句,试想一个这个场景,如果一个表主键现在已经增长到8了,也就是id=8,此时我们删除这条记录,那么再次插入值时候,这个值会是几???...在innodb存储引擎中,针对每个增长字段都有一个增长计数器,在对还有增长表进行插入操作时候,这个计数器会被初始化,在mysql中,我们可以执行下面的语句来得到这个计数器的当前值: select...MySQL5.1.22版本对这种锁进行了升级,提出了一个参数innodb_autoinc_lock_mode参数来控制增长模式,这个参数默认值是1,总共可以设置三个值0,1,2 mysql--dba_admin

    2.5K30

    MySQL列属性之增长

    增长通常是跟主键搭配。 新增增长 任何一个字段要做增长必须前提是本身是一个索引(key一栏有值)。 增长字段必须是数字(整型) 一张表最多只能有一个增长,和主键一起搭配。...关于相关新建增长语句: create table my_auto( id int auto_increment comment'自动增长', name varchar(10) not null )...相关增长使用语句: #触发自增长 insert into my_auto(name) values('小君'); insert into my_auto values(null,'小黑'); insert...如上图运行结果可知: 1.增长起始为1,且每次加1。 2.增长如果对应字段输入了值,那么增长失效,但是下一次还是能够正确增长,即值加1。...可以修改变量实现不同效果:修改是针对整个数据修改,而不是单张表(修改是会话级) 语句形式:set auto_increment_increment=5; — 一次修改5 删除增长 增长是字段一个属性

    4.7K20

    MySQL 主键一定是连续

    但实际上,MySQL 主键并不能保证一定是连续递增。...更遗憾是,即使在增初始值和步长这两个参数都设置为 1 时候,主键 id 也不一定能保证主键是连续 增值不连续场景 2 举个例子,我们现在往表里插入一条 (null,1,1) 记录,生成主键是...如下图所示,增值仍然固执地从 4 增加到了 5: 所以这时候我们再去插入一条数据(null, 3, 3)时候,主键 id 就会被自动赋为 5 了: 那么,为什么在出现唯一键冲突或者回滚时候,MySQL...接下来,继续执行其他事务就会申请到 id=2。这时,就会出现插入语句报错“主键冲突”。...增值不连续场景 4 对于批量插入数据语句MySQL 有一个批量申请增 id 策略: 语句执行过程中,第一次申请增 id,会分配 1 个; 1 个用完以后,这个语句第二次申请增 id,会分配

    3.8K10

    MySQL主键为什么不连续

    主键可以让主键索引尽量保持递增顺序插入,避免页分裂,索引更加紧凑。 主键保存在何处?...不同引擎对于增值保存策略不同: MyISAM引擎增值保存在数据文件中 InnoDB引擎增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,增值没有持久化每次重启后第一次打开表时候...,会找增值最大值max(id),然后将最大值加1作为这个表增值;MySQL8.0版本会将自增值变更记录在redo log中,重启时依靠redo log恢复。...(去主键索引树上判断该id是否存在) 把增id锁范围扩大,必须等到一个事务提交后才,下一个事务才可以申请id,锁粒度太大,系统并发能力极大下降 为了避免上述性能消耗,InnoDB即使语句执行失败也不回退增...值设置为1,对于insert...select这种无法提前知道申请多少个id,那就在需要时候申请1个,如果有10w行数据那就需要申请10万次,对于批量插入数据语句MySQL有一个批量申请增id策略

    8.4K20

    mysql为什么建议使用主键

    我们都知道表主键一般都要使用增 id,不建议使用业务 id ,是因为使用增 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...如果主键增 id 的话,mysql 在写满一个数据页时候,直接申请另一个新数据页接着写就可以了。...如果主键是非增 id,为了确保索引有序,mysql 就需要将每次插入数据都放到合适位置上。...其实对主键 id 还有一个小小要求,在满足业务需求情况下,尽量使用占空间更小主键 id,因为普通索引叶子节点上保存主键 id 值,如果主键 id 占空间较大的话,那将会成倍增加 mysql...本来这篇文章是打算总结一下前面写几篇关于 mysql 索引文章,也是打算多举几个例子,结果发现光写了一个主键就写了一大堆了,然后时间也比较晚了,干脆就写到这吧,原本计划几个其他例子后面再单独写吧

    5K31

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

    值重复情况下三种语句处理方式。...最终发现了MySQL主键增值“空洞”了 1.场景准备 测试场景为MySQL 8.0: 主键重复场景 唯一键重复场景 1、建表,包含主键及唯一约束 CREATE TABLE t1( id int(...key 't1.uk_c1' insert ignore into insert方式插入数据在处理过程中发生主键传统等错误时候,语句会被终止,并告知错误原因。...InnoDB引擎增值,其实是保存在了内存里,并且到了MySQL 8.0版本后,将自增值变更记录在了redo log中,当MySQL发生重启时候依靠redo log恢复重启之前增值。...,但如果往小修改就要看目前数据库插入值是否会将修改后增值“卡”在中间,如果出现这种情况是没办法改回去,原因显而易见,增属性与主键配套使用,如果现在表里id=4和id=6之间差了个5值,将自增值改回

    2.2K20

    【说站】mysql主键用完处理办法

    mysql主键用完处理办法 一般情况下,我们不会让单表存储这么多数据,所以一般不会出现这个问题。 处理办法: 1、可以使用bigint(无符号)类型作为主键。...如果真的在一个表中存储那么多数据,或者在数据迁移时造成主键混乱。 2、使用bigint(无符号)类型时,每秒插入大量数据,单表数据量依然能够持续存放相当长时间。...实例 主键字段在达到定义类型上限后,再插入一行记录,则会报主键冲突错误。...,这个表AUTO_INCREMENT没有改变(还是4294967295),就导致了第二个insert语句又拿到相同增id值,再试图执行插入语句,报主键冲突错误。...以上就是mysql主键用完处理办法,希望对大家有所帮助。更多mysql学习指路:MySQL 推荐操作系统:windows7系统、mysql5.8、DELL G3电脑

    2.8K30

    Mybatis获取自增长主键id

    这样就有一个问题,我们怎么才能将user与role两者关联起来呢,要知道我们关联user与role就是将user主键userId与role主键roleId插入到user-role这个关联表中,之前因为我们是先创建在分配...所以对于如何取得增长Id就比较麻烦.查阅资料后发现,还是有办法解决.而且有两种方法,这里都分享给大家,并且我自己也都测试了,的确可用. 2.解决方案 2.1方案一 这段代码加在你insert语句中...Id.前者使用与自己定义增长规则id,后者就是用与我们情况即增长id 小栗子: <insert id="insertSelective" parameterType="ams.web.admin.entity.UserDao...说明的确是读取到了<em>自</em><em>增长</em><em>的</em>userId,数据也成功插入了. 2.2方案二 <insert id="insertSelective" parameterType="请求对象" useGeneratedKeys...user表中数据成功插入: ? 再看看关联表中数据插入了没有: ? 也成功插入了,显然两者都能读取到增长userId

    3.4K20
    领券