精华内容
下载资源
问答
  • 如果mysql的自增主键达到最大值会发生什么?
    千次阅读
    2019-10-25 09:44:04

             如果mysql的自增主键达到最大值会发生什么?比如主键类型设为int,其最大值为:2147483647,如果此时我们再往其中写入数据,就会发生异常:

    Duplicate entry '2147483647' for key 'PRIMARY'

    也即写不进去了。如果发生了这种情况,应该是设计架构就有问题。并且当数据达到千万上亿级别,查询将变得奇慢无比,也是不可取的。在设计架构的时候就应该根据业务情况进行分库分表,至少达到每个表不超过千万级。

           另外一种很不可取的做法是,数据写入一张表中,当数据量很大的时候,就定时将某个时间之前的数据挪到另外的表中,然后删除。这样做不仅有上述问题,还有删除表数据的一些弊端。见另外一篇博客:关于mysql的delete和主从同步问题

    更多相关内容
  • Mysql 的自增主键达到最大值,会发生什么你知道吗?就在今天,我们线上就发生了这种问题!!! 他会发生异常,报错如下: Duplicateentry'2147483647'forkey'PRIMARY' org.springframework.dao....

    1、遇到的问题

    Mysql 的自增主键达到最大值,会发生什么你知道吗?就在今天,我们线上就发生了这种问题!!!

    他会发生异常,报错如下:

    Duplicate entry '2147483647' for key 'PRIMARY'

    org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

    insert 数据就会报错。

    2、分析

    总结来说这算是架构上的设计问题吧。先说一下我们目前暴露出来的俩问题:

    ① Mysql 的自增主键默认是 int 类型,4 个字节,一个字节 8 位,即如果是有符号的位的话,最大值就是(2^31)-1,也就是2147483647,基本也就能存储 20 亿数据。当数据达到千万上亿级别时,查询数据就会特别特别慢了,所以我们就采取了数据归档。这里是另外一个坑下面在介绍。应该根据业务数据量,分析数据的增长情况,提前规划进行分库分表,至少要保证每个表不超过千万级。这样才能保证查询效率。

    ② 这里说下上边提到的另外一个坑:我们的因为查询比较慢,对表做过几次数据归档,就是将数据写入一张表中,当数据量很大时,就定时将某个时间之前的数据写入另一个表中,这样做也是有一些坑的。

    Mysql的 delete 并不会真正的删除磁盘空间,而只是标记相应的区域,在合适的时候还可以再利用。如果要真正腾出磁盘空间还必须使用 optimize table xxx 进行磁盘碎片处理,但是这个命令会在相应的库下产生一个很大的 #sql-xxx 文件,此文件的赠长速度特别快,要清除的表越大它的增长速度就越快,所以不能等磁盘已经快满了才想起来清理。

    而且 optimize 命令会锁表,一般根据表的数据增长速度和删除等情况综合考虑决定 optimize 命令的执行频率。比如在访问量最小的时候一个月或者两个月执行一次。

    3、解决办法

    ① 修改 id 字段类型,int 改为 bigint(太占空间了,一个bigint的存储大小为8字节) bigint 的大小是8个字节,一个字节 8 位,有符号的最大值就是 2 的 63 次方 -1。即 bigint 带符号的范围是 -9223372036854775808 到 9223372036854775807。无符号的范围是 0 到 18446744073709551615。

    ② 有能力还是分表,有效避免这个问题

    ③ 将 int 类型设置为无符号的可以扩大一倍

    基于以上三种最好的处理方法还是分库分表。

    4、临时解决方案

    目前我们基于线上的临时解决方案是新建了一个同结构的表,业务数据走新表,查询兼容旧表

    展开全文
  • mysql出现主键自增长到最大

    使用mysql数据库:

    因为数据库主键增长到啦最大值,数据id达到了20亿,查询数据好像只有200万数据;

    int字段:数据的范围在-2^31~2^31-1

    2^31-1 = 2147483647

    unsigend long int是无符号整数类型,能表示的整数范围是0~4294967295,即0~2^32-1。

    主键自增到最大时候:

    int有符号:

    处理方案:

    之前id的值是int,现在设计一个新的表,将新的表的id的类型为bigint 或者(将int有符号修改为无符号),然后将原来的数据copy到新表中,当copy完成后再将新表的表名修改为原来的表,原来的表名也修改下。

    但是后台代码需要先更新,之前后台用的是Integer,不然的话插入就会报

    数据的是正常插入没有问题,就是后台会有异常 

    展开全文
  • mysql自增主键达到最大后如何处理

    千次阅读 2021-05-12 15:16:55
    然后如果这个自增主键达到最大值,是会报错的 Duplicate entry '2147483647' for key 'PRIMARY' 错误翻译过来的意思大概是主键2147483647重复了。 解决方法: ①、修改id字段类型,int改为bigint(太占空间了,...

    在mysql中int类型占四个字节,有符号书的话,最大值就是(2^31)-1,也就是2147483647,二十多亿。
    然后如果这个自增主键达到最大值,是会报错的

    Duplicate entry '2147483647' for key 'PRIMARY'

    错误翻译过来的意思大概是主键2147483647重复了。

    解决方法:

    ①、修改id字段类型,int改为bigint(太占空间了,一个bigint的存储大小为8字节) bigint的大小是8个字节,一个字节8位,有符号的最大值就是2的63次方-1

    ②、有能力还是分表,有效避免这个问题

    ③、将int类型设置为无符号的可以扩大一倍

    有符号int最大可以支持到约22亿,远远大于我们的需求和MySQL单表所能支持的性能上限。

    对于OLTP应用来说,单表的规模一般要保持在千万级别,不会达到22亿上限。如果要加大预留量,可以把主键改为改为无符号int,上限为42亿,这个预留量已经是非常的充足了。
    使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据换入换出,额外增加了IO的压力,对性能是不利的。

    因此推荐自增主键使用int unsigned类型,但不建议使用bigint

    有能力选择分表,更好解决这个问题。

     

    展开全文
  • alter table 表名 auto_increment= 起始
  • 如果数据大于11000,则设置无效 INNODB自增主键的一些问题 vs mysql获得自增字段下一个 今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of...
  • " 你:这问题我们在实际应用到没有遇到过,我们自增主键虽然采用的int类型,但我们不会达到最大值,在没达到最大值,查询性能就受到影响,我们会采取就要考虑分库分表方案了。 要是面试官继续穷追不舍,问你有关分库...
  • 结论:它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。...3、navicat设计表,把主键改为最大值 4、插入数据,报错 5、怎么办 https://blog.csdn.net/u013008898/article/details/116709305 ...
  • insert、update、delete元素 ...(自增在xml不需要传入主键id参数,mysql插入数据主键自增) <!-- public int insertEmployee(Employee employee); --> <!-- 让MyBatis自动的将自增id赋值.
  • MySQL中的自增主键用完了怎么办?

    万次阅读 多人点赞 2019-08-25 09:26:21
    在面试中,大家应该经历过如下场景 面试官:"用过mysql吧,你们是用自增主键还是UUID?...面试官:"那自增主键达到最大值了,用完了怎么办?" 你:"what,没复习啊!!" (然后,你就可以回去等通知...
  • 自增 主键

    千次阅读 2021-01-22 17:41:49
    我们前面提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。 自增值的实现机制 1.存储 表定义里面出现了一个 AUTO_INCREMENT=2,表示下一次插入数据时,如果...
  • 然后如果这个自增主键达到最大值,是会报错的 Duplicate entry '2147483647' for key 'PRIMARY' 错误翻译过来的意思大概是主键2147483647重复了。 解决方法:修改id字段类型,int改为bigint,有能力还是分表,...
  • 文章目录背景测试过程创建表,自增ID场景一:测试自增ID已经达到最大值场景二:测试自增ID即将达到最大值总结解决方案扩展扩展1:修改字段的数据类型,建议使用modify 用法扩展2:Alter table的底层原理 背景 之前的...
  • int 最大值 在上表中我们看到,首位的 bit 用来表示符号,因此在 sigend 是少一位 bit 来存储内容。int 是 4 byte,结合上述,可以得出 int 在 signed 最大值为 231−1=2147483647 在 unsigned 中,无需首位 ...
  • create sequence test_seqminvalue 1 --最小值maxvalu 100 --该序列最大到100,使用NOMAXvalue 可以不设置最大值start with 1 --从1开始递增increment by 1 --每次递增1nocache; --不设置缓存。cache 10设置每次缓存...
  • 一、创建序列 1.1、直接在PLSQL中设置 1.2、命令创建 create sequence seq_users ##创建序列...maxvalue 9999999 ##最大值 order ##确保按照请求次序生成整数 【不常用的设置】.只有在使用Real Application Cluster(RA
  • 以前建立自增主键都是用mysql建的,只要写个 auto_increment就行了,最近因为工作,需要用到PostgreSQL的自增主键,就去了解了下。发现网上的这点东西写的真乱…就没有个说是整整齐齐从头到尾说清楚的,没有就只能我...
  • MySQL自增主键详解

    千次阅读 2021-01-18 19:35:11
    一、自增值保存在哪儿?不同的引擎对于自增值的保存...每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+步长作为这个表当前的自增值select max(ai_col) from table_name for upda...
  • MySQL 自增主键

    千次阅读 2022-02-10 17:46:23
    ​ 在创建主键的时候可以使用AUTO_INCREMENT关键字进行自增主键设置,设置之后,每插入一条数据之后主键都会自动累加1 ​ 使用AUTO_INCREMENT=100可以在表级别设定偏移量,比如这里设定为100,即从100开始累加 2、...
  • mysql 变更自增主键id起始

    千次阅读 2020-04-03 15:12:57
    目录 account 库 user 表结构 获取自增id字段的下一个 修改自增id字段的初始 其他 SQL 说明 参考文档 account 库 user 表结构 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name...
  • SQL 设置自增主键

    千次阅读 2018-01-23 11:36:31
    dbcc checkident ('tableName', reseed,6)语句中2个参数:tableName,我们要修改自增值的表名, 6 设置自增的当前,我们可以根据自己的需要调整这些数据. 函数具体的运行效果:  1.讲当前自增字段, 移动到设置的...
  • 面试官:”那自增主键达到最大值了,用完了怎么办?” 你:”what,没复习啊!!” (然后,你就可以回去等通知了!) 这个问题是一个粉丝给我提的,我觉得挺有意(KENG)思(B)! 于是,今天我们就来谈一谈,这个自增主键...
  • Mybatis 获取自增主键

    2022-02-20 16:29:16
    若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键后...
  • mysql自增主键详解

    2021-04-08 23:22:30
    文章目录什么是自增主键自增主键的优点好处?自增值保存在哪儿?自增值修改机制自增主键 id不能保证连续的原因?原因一:唯一键冲突原因二:事务回滚原因三:自增锁的优化思考题 什么是自增主键? 当设置了主键...
  • Mysql 自增主键

    2021-05-30 18:51:55
    整型结合属性 auto_increment,可以实现自增功能,但在表结构设计时用自增主键,希望你特别要注意以下两点,若不注意,可能会对业务造成灾难性的打击: 用 BIGINT 做主键,而不是 INT; 自增值并不持久化,可能会...
  • ALTER TABLE DB2INSTL.BT_AUDIT_COUNTY_DIFF_HISTORY_PX ALTER COLUMN ID RESTART WITH 18239 转载于:https://www.cnblogs.com/wangpei/p/7844542.html
  • Oracle 创建自增主键

    2022-03-19 15:55:59
    Oracle没有这个auto_increment属性,所以它无法像MySQL般在表内定义自增主键。但是,Oracle里的序列,可间接实现自增主键的作用。 序列: 序列(Sequence),又叫序列生成器,用于提供一系列的数字,开发人员使用...
  • MySQL自增ID最大值被使用

    千次阅读 2015-03-23 11:00:22
    问题:评论数据表hotel_info_comments自增ID列达到最大值2147483647,但是并不是每一个ID都被使用了   解决办法:清理数据表的跳跃自增ID,保持ID连贯。   解决步骤:   1. 创建评论临时表 create table `...
  • 39 | 自增主键为什么不是连续的? CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`) ) ENGINE=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,869
精华内容 15,547
关键字:

自增主键最大值