解决mysql的int型主键自增问题


Posted in MySQL onJuly 15, 2021

引入

我们在使用mysql数据库时,习惯使用int型作为主键,并设置为自增,这既能够保证唯一,使用起来又很方便,但int型的长度是有限的,如果超过长度怎么办呢?

暴露问题

我们先创建一个测试表,创建语句如下:

CREATE TABLE test1 (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
)

然后我们插入两条数据:

INSERT INTO test1 VALUES(NULL,'小牛');
INSERT INTO test1 VALUES(NULL,'大牛');

查询表显示正常:

解决mysql的int型主键自增问题

int型的有符号的范围为231 -1 = 2147483647,我们直接插入一条数据id为2147483647,如下:

INSERT INTO test1 VALUES(2147483647 ,'小华')

结果显示正常:

解决mysql的int型主键自增问题

此时自增ID已达到了int型的上限,如果我再插入数据,就会报错:

INSERT INTO test1 VALUES(NULL,'母牛');

解决mysql的int型主键自增问题

此时主键已无法自增,插入的id仍然是2147483647,就违反了主键唯一的条件,所以报错。

解决问题

(1)使用更大的数据类型bigint

bigint的范围是263-1,所谓指数爆炸,此时的大小达到了9,223,372,036,854,775,807的可怕量级,简单来说就是用bigint 一天100w条数据也得存200亿年才能自增爆炸,所以在当前场景,几乎不用担心bigint会自增满

我们修改数据类型为bigint,如图

解决mysql的int型主键自增问题

再执行插入语句:

INSERT INTO test1 VALUES(NULL,'母牛');

又能够正常插入了:

解决mysql的int型主键自增问题

(2)使用UUID作为主键

我们都知道,UUID会根据当前系统性能,时间戳等一系列参数经过运算得到一个全世界唯一的字符串,并且mysql提供了生成UUID的方法,用它作为主键能够保证数据的唯一性。

利用如下代码可以生成32位的UUID:

-- 生成32位UUID
SELECT REPLACE(UUID(),'-','') AS UUID;

解决mysql的int型主键自增问题

然后咱们再创建一个测试表:

CREATE TABLE test2(
  id VARCHAR(50) PRIMARY KEY,
  NAME VARCHAR(20) NOT NULL
)

插入一条数据:

-- 插入UUID
INSERT INTO test2 VALUES(REPLACE(UUID(),'-',''),'老王');

解决mysql的int型主键自增问题

但这样写插入语句每次都要手写UUID函数,貌似有点太麻烦了,咱们可以写一个触发器,让触发器自动为我们设置ID:

-- 创建触发器
DELIMITER $$
CREATE
TRIGGER auto_id        -- 名称
BEFORE INSERT          -- 触发时机
ON test2 FOR EACH ROW   -- 作用于test2表,对每行数据生效
BEGIN
IF new.id = '' THEN     -- 当id为空字符串时设置UUID
  SET new.id = REPLACE(UUID(),'-','');
END IF;
END$$

插入一条数据:

-- 插入一条数据
INSERT INTO test2 VALUES('','小王');

结果能正常添加

解决mysql的int型主键自增问题

总结

(1) 用int型和bigInt型增删改查速度较UUID更快,并且更节省空间。

(2) 用UUID更方便。

为何要使用自增int作为主键

相信大家都知道要使用无符号自增int作为主键的数据类型,可你知道为何要使自用增int而不是使用varchar、text、varchar等类型吗?

大家也能说出一些优点:对上层业务透明,插入数据时无需显示指定;数据类型简单,更便于存储维护表结构

其实,使用自增int作为主键好处多多,今天我们就来一起学习一下,并强烈建议大家在实际开发中使用自增int作为主键。

优点:

1、int 相比varchar、char、text使用更少的存储空间,而且数据类型简单,可以节约CPU的开销,更便于表结构的维护

2、默认都会在主键上建立主键索引,使用整形作为主键可以将更多的索引载入内存,提高查询性能

3、对于InnoDB存储引擎而言,每个二级索引都会使用主键作为索引值的后缀,使用自增主键可以减少索引的长度(大小),方便更多的索引数据载入内存

4、可以使索引数据更加紧凑,在数据插入、删除、更新时可以做到索引数据尽可能少的移动、分裂页,减少碎片的产生(可以通过optimize table 来重建表),减少维护开销

5、在数据插入时,可以保证逻辑相邻的元素物理也相邻,便于范围查找

当然,使用自增int作为主键也不是百利无一害,在高并发的情况下也可能会造成锁的争用问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
MySQL update set 和 and的区别
May 08 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL 如何分析查询性能
May 12 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
mysql 排序失效
May 20 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 #MySQL
mysql备份策略的实现(全量备份+增量备份)
mysql定时自动备份数据库的方法步骤
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 #MySQL
MySQL一些常用高级SQL语句
MySQL系列之十四 MySQL的高可用实现
MySQL系列之十二 备份与恢复
Jul 02 #MySQL
You might like
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python实现合并两个列表的方法分析
2018/05/28 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python数组循环处理方法
2019/08/26 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
入党自我评价优缺点
2014/01/25 职场文书
见习期自我鉴定
2014/01/31 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
项目申请汇报材料
2014/08/16 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
校园广播稿范文
2015/08/19 职场文书
JS函数式编程实现XDM一
2022/06/16 Javascript