面试官:数据库自增ID用完了会怎样
源 /艾小仙 文/ 小仙
看到这个问题,我想起当初玩魔兽世界的时候,25H难度的脑残吼的血量已经超过了21亿,所以那时候副本的BOSS都设计成了转阶段、回血的模式,因为魔兽的血量是int型,不能超过2^32大小。
1. 有主键
如果设置了主键,并且一般会把主键设置成自增。
CREATE TABLE `test1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483647 DEFAULT CHARSET=utf8mb4;
insert into test1(name) values('qq');
如果再次执行插入语句:
insert into test1(name) values('ww');
1062 - Duplicate entry '2147483647' for key 'PRIMARY', Time: 0.000000s
。2. 没有主键
如果没有设置主键的话,InnoDB则会自动帮你创建一个6个字节的row_id,由于row_id是无符号的,所以最大长度是2^48-1。
CREATE TABLE `test2` (
`name` varchar(32) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ps -ef|grep mysql
拿到mysql的进程ID,然后执行命令,通过gdb先把row_id修改为1sudo gdb -p 2584 -ex 'p dict_sys->row_id=1' -batch
insert into test2(name) values('1');
insert into test2(name) values('2');
insert into test2(name) values('3');
sudo gdb -p 2584 -ex 'p dict_sys->row_id=281474976710656' -batch
insert into test2(name) values('4');
insert into test2(name) values('5');
insert into test2(name) values('6');
然后查询数据会发现4条数据,分别是4,5,6,3。
总 结
如果设置了主键,那么将会报错主键冲突。 如果没有设置主键,数据库则会帮我们自动生成一个全局的row_id,新数据会覆盖老数据
解决方案:
好文推歌
程序员版孔乙己
1200万的天价离职赔偿!
北大女生:我被字节 PUA 了!
一键三连「分享」、「点赞」和「在看」
技术干货与你天天见~
评论