, properties.getPassword()); String sql = "insert into account(user_id...PreparedStatement pst = connection .prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);//设置自增id...account.getUsed()); pst.setBigDecimal(4,account.getResidue()); pst.execute(); //获取自增...id long id = 0; ResultSet resultSet = pst.getGeneratedKeys(); if(resultSet.next...()){ id = resultSet.getLong(1); } LOGGER.info("新增的id为{}",id); }
现在有这样一个需求,就是我向A表中插入一条数据,id是自增的。...插入之后,还需要向B表中插入一条数据,但是B表中需要保存的数据中要使用刚刚A表自增后的id, 这个其实是一个比较常见的需求,就是两张表之间的一个关联,如果用程序来执行也是很容易实现。...比如我就在用sql执行之后,获取A的id插入到B表中 实现方式如下: insert into A (id,name,code) values (null, "zhagnsan", "zs"); // 注意...A表的id要设置为自增,给null值即可 set @id = @@IDENTITY; // 使用id变量保存刚刚自增生成的id insert into B (id,a_id,name) values...(null, @id, "lisi"); // 使用变量获取A表Id 上面是用自定义变量的形式进行保存的,如果你只是想查一下是多少,可以直接使用: select @@IDENTITY; 好了,如果对你有帮助
="true" keyProperty="id" parameterType="com.shengtong.smartlamppost.admin.dao.entity.linkage.Strategy..." > insert into linkage_strategy (id, strategy_name, priority, status, create_by, create_date,...,jdbcType=VARCHAR} ) 总结: 想要获取自增主键id,应该通过对象的getId()方法,而并不是insert的返回值,insert的返回值表示的是影响行数...2.在mapper.xml中:useGeneratedKeys="true"、keyProperty="id",这两个属性的作用: 共同决定了sql执行后,会将主键封装到id属性上; 自增主键封装到了对象的...id属性上了,那么想要获取,直接调用对象的getId()方法就可以了
在实际测试工作过程中,有时因为生产环境已有历史数据原因,需要测试环境数据id从某个值开始递增,此时,我们需要修改数据库中自增ID起始值,下面以MySQL为例: 表名:users; 建表时添加: create...table users(id int auto_increment primary key,666); 表已创建,修改: alter table users add id int auto_increment...primary key; #将自增字段设置为primary key alter table users AUTO_INCREMENT=10000;
// MySQL replace into导致的自增id问题 // 今天线上遇到一个问题,挺有意思,这里记录一下希望对大家有所帮助。...某个表中,只有一条记录,发生高可用切换之后,自增id的值发生了变化,主从的自增id值不一致,导致数据写入报主键冲突的错误。...我们知道,在MySQL中,是支持replace语法的,当你执行replace into的时候,如果该条记录存在,那么replace会删除这条记录,然后重新insert一条新记录。...*/; 可以看到,MySQL将replace into的在binlog中保存的格式是update语句,那么update语句本质上不会对自增值进行修改,所以就导致了主从的表自增id不一致,这样虽然看着没有什么问题...,从库的自增id比主库的小,当主从发生切换的时候,这个问题就比较严重了,有些数据写入的时候,就会报错了。
=4 DEFAULT CHARSET=latin1 自增ID为4,删除ID最大的记录并不影响自增ID的值。...MySQL 重启后自增ID从哪儿开始 例如当前表中有ID为1,2,3三条记录,把3删除,重启MySQL,新插入记录的ID从哪儿开始? 很多人会认为从4开始,实际是从3开始。...重启MySQL。...手动插入ID后,下次插入时自增值是多少 例如当前的自增ID为4,新插入记录时,手动指定ID为10,下次使用自增方式插入时,ID是 11。...删除最大ID值对自增ID值没有影响,但MySQL重启之后有影响,不会使用之前的自增ID值,而是使用最大ID+1,因为自增ID值是存在内存中,重启后需要重新计算。 自增ID用完后就不变了。
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) ---- mysql获取自增id的几种方法 使用max函数:select max(id) from tablename...缺点:获取的不是真正的自增id,是表中最大的Id,如果有删除数据的话,那么该值和自增id相差比较大。如果有连表数据,有可能导致数据错乱。...使用mysql查询函数:SHOW TABLE STATUS; 优点:能够准确的查到自增id。而且可以在语句后面加上where语句或者like语句来过滤。...---- mysql自增id的重置 使用truncate:truncate table; 说明:使用truncate会删除表的数据释放空间,并且重置字自增id,但不会删除表的定义。...也不会清空数据,有可能会出现重复key的可能,所以此方法也只适用于清空表之后重置自增id或者大量删除后修改自增id。
当我们使用 MySQL 进行数据存储时,一般会为一张表设置一个自增主键,当有数据行插入时,该主键字段则会根据步长与偏移量增长(默认每次+1)。...自增的值并不是保存在表结构信息内的,对于不同的版本它们有如下的区别: 1.1.1 MySQL 8.0版本之前(重启后可能会产生变化): 计数器的值存储在内存中的,重启后丢弃,下一次将读取最大的一个自增ID...不一定,业务也不应该过分依赖 MySQL 自增 ID 的连续性,在以下三种情况下,并不能保证自增 ID 的连续性: 1.5.1 插入时的其他唯一索引冲突 假设已存在数据{1,张三},且张三所属的字段设置了唯一主键...3.1 自增 ID 输入输出前进行转义 在输出或者获取前对指定字段进行可逆的转义操作 优点:实现起来比较简单,无论单体业务或者分布式应用都无需考虑对数据源的解析,只需在客户端实现自己的转义与解析方法即可...; 缺点:业务入侵较大,且需要前后端各个合作方确认统一的标准;如果转义方法有调整,变更影响面也会很大;字符串长度会随ID长度而变化,使用空位填充也会特别明显; 3.2 Snowflake 雪花算法: 优点
问题:MySQL某个表自增id溢出导致某业务block 背景: tokudb引擎的一个大表tb1,存放业务上的机审日志,每天有大量的写入, 并且由于历史原因,这张表是int signed 类型的...只需要下面几步: use logdb; select max(id) from tb1; -- 记录下当前最大的id为 xxxx create table tb2 LIKE tb1; -- 创建影子表...alter table tb2 modify column id bigint unsigned not null auto_increment ; -- 修改新表为bigint unsigned...alter table tb2 auto_increment=xxxx+1; -- 改大新表的自增主键起始值 rename table tb1 to tb_archive , tb2 to tb1;...后续优化措施: 增加对自增id的监控, 见这里 https://blog.51cto.com/lee90/2427912 整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案
MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,计算机存储就有上限。...那自增id用完,会怎么样? 表定义自增值id 表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变。...InnoDB系统自增row_id 若你创建的InnoDB表未指定主键,则InnoDB会自动创建一个不可见的,6个字节的row_id。...InnoDB里,申请到row_id=N后,就将这行数据写入表中;若表中已经存在row_id=N的行,新写入的行就会覆盖原有的行。 验证该结论:通过gdb修改系统的自增row_id。...因为MySQL使用了一个唯一数组 给新线程分配thread_id时的逻辑: 总结 每种自增id有各自的应用场景,在达到上限后的表现也不同: 表的自增id达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突错误
作者:废柴程序员 链接:https://www.jianshu.com/p/a6bc14005b52 MySQL的自增id都定义了初始值,然后不断加步长。...InnoDB系统自增row_id 若你创建的InnoDB表未指定主键,则InnoDB会自动创建一个不可见的,6个字节的row_id。...InnoDB里,申请到row_id=N后,就将这行数据写入表中;若表中已经存在row_id=N的行,新写入的行就会覆盖原有的行。 验证该结论:通过gdb修改系统的自增row_id。...所以应该在InnoDB表中主动创建自增主键:当表自增id到达上限后,再插入数据时会报主键冲突错误。 毕竟覆盖数据,就意味着数据丢失,影响数据可靠性;报主键冲突,插入失败,影响可用性。...因为MySQL使用了一个唯一数组 图片 给新线程分配thread_id时的逻辑: 图片 总结 每种自增id有各自的应用场景,在达到上限后的表现也不同: 表的自增id达到上限后,再申请时它的值就不会改变
MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,计算机存储就有上限。...那自增id用完,会怎么样? 表定义自增值id 表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变。...InnoDB系统自增row_id 若你创建的InnoDB表未指定主键,则InnoDB会自动创建一个不可见的,6个字节的row_id。...InnoDB里,申请到row_id=N后,就将这行数据写入表中;若表中已经存在row_id=N的行,新写入的行就会覆盖原有的行。 验证该结论:通过gdb修改系统的自增row_id。...因为MySQL使用了一个唯一数组 给新线程分配thread_id时的逻辑: 总结 每种自增id有各自的应用场景,在达到上限后的表现也不同: 表的自增id达到上限后,再申请时它的值就不会改变
自增id 说到自增id,相信你的第一反应一定是在设计表结构的时候自定义一个自增id字段,那么就有一个问题啦,在插入数据时有可能唯一主键冲、sql事务回滚、批量插入的时候,批量申请自增值等原因导致自增id...它在 MySQL 中是用来对应事务的。 MySQL 内部维护了一个全局变量 global_query_id,每次执行语句的时候将它赋值给 Query_id,然后给这个变量加 1。...InnoDB 数据可见性的核心思想是:每一行数据都记录了更新它的 trx_id,当一个事务读到一行数据的时候,判断这个数据是否可见的方法,就是通过事务的一致性视图与这行数据的 trx_id 做对比。...但是这个过程有脏读存在,那么这个id就不会是原子性的,存在重复的可能性。 thread_id 其实,线程 id 才是 MySQL 中最常见的一种自增 id。...结果跟row_id一样,就会覆盖原有记录了。 上面介绍了几种MySQL自身的一些自增id,其实,实际运用中,我们也可能会选择外部的自增主键,然后持久化到数据库,以此来代替数据库自身的自增id。
如果你用过或了解过MySQL,那你一定知道自增主键了。每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1)。...自增id 说到自增id,相信你的第一反应一定是在设计表结构的时候自定义一个自增id字段,那么就有一个问题啦,在插入数据时有可能唯一主键冲、sql事务回滚、批量插入的时候,批量申请自增值等原因导致自增id...InnoDB 数据可见性的核心思想是:每一行数据都记录了更新它的 trx_id,当一个事务读到一行数据的时候,判断这个数据是否可见的方法,就是通过事务的一致性视图与这行数据的 trx_id 做对比。...但是这个过程有脏读存在,那么这个id就不会是原子性的,存在重复的可能性。 thread_id 其实,线程 id 才是 MySQL 中最常见的一种自增 id。...上面介绍了几种MySQL自身的一些自增id,其实,实际运用中,我们也可能会选择外部的自增主键,然后持久化到数据库,以此来代替数据库自身的自增id。下面来说说吧。
在mysql中有多种自增id,除了我们日常开发中经常使用的自增主键外,还有一些其他的自增id,主要是mysql内部为了辅助其正常运行而使用的。 这些自增id,都是定义了初始值,然后不停的累加步长。...对于每一种自增id,在mysql中都会定义其数据类型,以及这个数据类型所占用的字节长度,也就是说每个自增id,都是有上限的,只不过上限的大小不尽相同而已,既然自增id有上限,那么就有可能被用完,那问题来了...在mysql中,对于不同的自增id值达到上限后,对应的处理方式是不同的。下面我们就对mysql中,几个比较重要的自增id进行分析一下。...'主键', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB; 一、自定义自增主键 自定义自增主键,是工作中最经常使用到的一种自增id,对于自增主键的一些细节问题可以参考你真的懂自增主键...为了能够让id字段快速达到这个上限,这里有两种方法: 1.直接插入一个id=4294967295 的数据行。
方案一: 跟我来: 1、开一个存储过程(不为啥,最近喜欢) 2、开一个事务(要上锁了) 3、某张表中有某行无关数据,或者就直接再你要用的这张表里吧,省的跳来跳去的。...4、给那行数据上行锁 5、插入自增数据行 6、获取自增数据行,max足矣,这个操作时间复杂度是 O(1) 的 7、提交事务 这个方案我试了,但是在C++操作MySQL时我不知道要怎么拿第二个结果集...像注册,这种需要自动生成账号类的场景用自增主键,因为自增主键我也不是很喜欢,主键还是要有自己的意义的。...不过这类业务,如果由用户自己输入账号,亦或是系统自己随机生成,都没有自增来的快,毕竟林子大了,就容易主键冲突。...网上也有不少帖子写了一大堆的解决方案,也讲了存储过程,但是很少看到有解释为什么要存储过程的。 上面那个解决方案一,精髓就在第四步。
首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。...我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 intunsigned,所以最大可以达到2的32幂次方 - 1 = 4294967295 这里有个小技巧,可以在创建表的时候,直接声明AUTO_INCREMENT...Duplicate entry '4294967295' for key 'PRIMARY' 0.00054 sec 说明,当再次插入时,使用的自增ID还是 4294967295,报主键冲突的错误...如果是这种情况,InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id,而且InnoDB 维护了一个全局的 dictsys.row_id,所以未定义主键的表都共享该row_id,每次插入一条数据...row_id一直涨,一直涨,直到2的48幂次-1时,这个时候再+1,row_id的低48位都为0,结果在插入新一行数据时,拿到的row_id就为0,存在主键冲突的可能性。
领取专属 10元无门槛券
手把手带您无忧上云