数据库自增ID会一直自增下去嘛?

首先来回答这个问题,不会一直自增下去。

首先,我们得知道主键其实分为两类,第一类就是自己定义的主键,第二类就是系统为我们自动创建的主键。

先看第一类,也就是我们自己显示定义的自增长主键,像下面这样

id int NOT NULL AUTO_INCREMENT
PRIMARY KEY (id)

这里我们以int类型来说,int的最大值为21亿左右(2^31-1),假设自增初始值从0开始计算,增量为1,0、1、2、3、4...,对于小型业务来说,大概率是达不到21亿的,但是对稍微大一点的业务来说,是比较容易达到21亿的。也就是说,这个主键已经封顶了,它已经达到了int的最大值,那么继续往里面插入数据会怎么样呢?

我可以很负责任的告诉你,会出bug,意思就是插入不进去了。你们可以去自己的电脑上试一试。其实出bug也很好理解,第一,这个类型已经达到了int的最大值了;第二,主键是不允许重复的。

你以为这就完了?并没有哦,还有一种就是我们并没有显示定义为主键,但它在系统中会认为是主键(前提是我们在这张表中没有定义主键)。它是谁呢?不卖关子了,它就是在某个列上加了唯一约束UNIQUE并且不允许为NULL(因为它具有唯一性),也就是像下面这样

id int UNIQUE NOT NULL

这个时候系统会把这个列当成主键了。

那遇到这一类情况该怎么办呢?其实也蛮好解决的,就把类型给扩大呗,把int改成bigint(8个字节),这个时候数据已经很大了,封顶的可能性很低,几乎为0。

接下来我们来看第二类,也就是当我们没有自定义主键和没有定义唯一约束UNIQUE并且不允许为NULL的列,这个时候系统会为我们创建一个主键ROW_ID,其实这也不能叫创建的,而是它原本就在,它属于隐藏列。稍微扩展一下,Mysql会为每张表默认添加一些列(也称为隐藏列),分别为:row_id、tr_id和roll_pointer,如果你想深入的了解,推荐去阅读相关书籍。回到主题,就是在我们我们没有自定义主键和没有定义唯一约束UNIQUE并且不允许为NULL的列时,系统会为我们创建一个主键,它就是row_id,默认值从0开始增长,但是也有范围哦,它为6个字节,最大值为2^48-1,也就是281474976710655,大概为281万亿左右,是不是发现数据很大,的确很大,但是相对于上面的8个字节的bigint还是差了蛮多的。那么当它要超出范围时,是不是也和上面一样会报错呢?

其实是不会的,大家可以去测试一下。那结果会如何呢?我先给你看它增长的规律:id = (id + 1)% 2^48,有没有发现什么呢,相信聪明的你肯定发现了其中的奥秘。对了,就是你想的那样,它是一个环(好比:0、1、2、0、1...),当要超出范围时,它会覆盖前面的数据,那这可是不能接受的哦(其实还是要看业务量)。

综上所述,最好的办法还是我们显示的定义主键而且主键尽量使用bigint类型(其实这一切的一切还得看业务量,之所以这样子说,是因为如果我们的业务量只是万级别的,那我们还要考虑这些问题嘛,其实压根没有必要考虑这些的)。

希望上面我的分享对你有所帮助,谢谢!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值