在真实业务场景中,整型类型最常见的就是在业务中用来表示某件物品的数量。例如上述表的销售数量,或电商中的库存数量、购买次数等。在业务中,整型类型的另一个常见且重要的使用用法是作为表的主键,即用来唯一标识一行数据。

整型结合属性 auto_increment,可以实现自增功能,但在表结构设计时用自增做主键,希望你特别要注意以下两点,若不注意,可能会对业务造成灾难性的打击:

用 BIGINT 做主键,而不是 INT;自增值并不持久化,可能会有回溯现象(MySQL 8.0 版本前)。

从表 1 可以发现,INT 的范围最大在 42 亿的级别,在真实的互联网业务场景的应用中,很容易达到最大值。例如一些流水表、日志表,每天 1000W 数据量,420 天后,INT 类型的上限即可达到。

因此,(敲黑板 1)用自增整型做主键,一律使用 BIGINT,而不是 INT。不要为了节省 4 个字节使用 INT,当达到上限时,再进行表结构的变更,将是巨大的负担与痛苦。

那这里又引申出一个有意思的问题:如果达到了 INT 类型的上限,数据库的表现又将如何呢?是会重新变为 1?我们可以通过下面的 SQL 语句验证一下:

CREATE TABLE t (a INT AUTO_INCREMENT PRIMARY KEY);mysql> INSERT INTO t VALUES (2147483647);Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO t VALUES (NULL);ERROR 1062 (23000): Duplicate entry '2147483647' for key 't.PRIMARY'

可以看到,当达到 INT 上限后,再次进行自增插入时,会报重复错误,MySQL 数据库并不会自动将其重置为 1。

第二个特别要注意的问题是,(敲黑板 2)MySQL 8.0 版本前,自增不持久化,自增值可能会存在回溯问题!

mysql> SELECT * FROM t;+---+| a |+---+| 1 || 2 || 3 |+---+3 rows in set (0.01 sec)mysql> DELETE FROM t WHERE a = 3;Query OK, 1 row affected (0.02 sec)mysql> SHOW CREATE TABLE t\G*************************** 1. row ***************************Table: tCreate Table: CREATE TABLE `t` (`a` int NOT NULL AUTO_INCREMENT,PRIMARY KEY (`a`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci1 row in set (0.00 sec

可以看到,在删除自增为 3 的这条记录后,下一个自增值依然为 4(AUTO_INCREMENT=4),这里并没有错误,自增并不会进行回溯。但若这时数据库发生重启,那数据库启动后,表 t 的自增起始值将再次变为 3,即自增值发生回溯。具体如下所示:

mysql> SHOW CREATE TABLE t\G*************************** 1. row ***************************Table: tCreate Table: CREATE TABLE `t` (`a` int NOT NULL AUTO_INCREMENT,PRIMARY KEY (`a`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci1 row in set (0.00 s

若要彻底解决这个问题,有以下 2 种方法:

升级 MySQL 版本到 8.0 版本,每张表的自增值会持久化;

若无法升级数据库版本,则强烈不推荐在核心业务表中使用自增数据类型做主键

其实,在海量互联网架构设计过程中,为了之后更好的分布式架构扩展性,不建议使用整型类型做主键,更为推荐的是字符串类型。

总结

  • 自增主键要用bigint
  • 自增主键最好用字符串类型

Mysql 自增主键相关推荐

  1. hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...

     前言"又要开始新项目了,一顿操作猛如虎,梳理流程加画图.这不,开始对流程及表结构了.我:吧啦吧啦吧啦 --老大:这个建表为啥还设置个自增 id ?直接用流水号(用户号/产品号)当主键不就行 ...

  2. mysql自增主键返回---创建成功后返回用户的ID

    mysql自增主键返回 查询id的sql SELECT LAST_INSERT_ID() 通过修改User.xml映射文件,可以将mysql自增主键返回: 如下添加selectKey 标签 <! ...

  3. mybatis获取mysql自增主键_Mybatis获取数据库自增主键

    一般我们都为将表中主键列设置为自增,当我们执行插入语句时,比如这样 //测试添加 Employee employee = new Employee(null, "jerry4",n ...

  4. mysql自增主键和mybatis自增主键不一致问题(已解决):

    mysql自增主键和mybatis自增主键不一致问题(已解决): 在插入数据前,先进行查询主键 <insert id="insertSelective"><sel ...

  5. 美团面试:MySQL 自增主键一定是连续的吗?

    美团问数据库比较多,分享一位读者面试美团遇到的关于 MySQL 自增主键的问题. 下面是正文. 众所周知,自增主键可以让聚集索引尽量地保持递增顺序插入,避免了随机查询,从而提高了查询效率 但实际上,M ...

  6. mybatis mysql自增主键_mybatis 自增主键配置

    mybatis 自增主键配置 mybatis自增主键配置(?) mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同.基本上经常会 遇到的就是 Oracle Seque ...

  7. mysql自增主键设置

    mysql自增主键设置 在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段的主键值.可以通过为表主键添加AUTO_INCREMENT关键字来实现. 默认情况下,在MYSQL中AUTO_INC ...

  8. mysql自增主键的返回

    1.Mybatis的基础配置 https://blog.csdn.net/qq_43163943/article/details/110261144 2.Mybatis自增主键的实现 执行顺序是先插入 ...

  9. 重置mysql自增主键值的方法

    重置mysql自增主键的值方法 show create table [表名] 查看当前主键索引值alter table [表名] auto_increment = [你希望的值] 设置你希望的索引值 ...

  10. Mysql 自增主键重复的问题

    问题描述 MySQL Bugs: #199: Innodb autoincrement stats los on restarthttps://bugs.mysql.com/bug.php?id=19 ...

最新文章

  1. Go 源码里的这些 //go: 指令,go:linkname 你知道吗?
  2. 大话中文文本分类之Transformers
  3. 00后都选哪些大厂?数据盘点00后入职情况,字节跳动门槛低?
  4. 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息
  5. Spring MVC:表单处理卷。 3 –复选框处理
  6. java 小题目_java一个小题目
  7. 【华为云技术分享】自动网络搜索(NAS)在语义分割上的应用(二)
  8. c语言有较强的网络操作功能吗,《对于C语言的理解》--06级网络班 刘丽君
  9. c fun函数求n个整数的平均值_Python语法示例——函数
  10. Python之文章生成器(升级版,也就是更傻瓜式运行)
  11. Intellij IDEA 导入Maven项目
  12. linux下安装oracle instant client,linux下安装Oracle instant client
  13. 计算机考试电子档照片,电子版照片是啥意思???
  14. 百度itextpdf工具类,快速生成PDF打印模板,itextpdf5加公章
  15. 数值分析龙贝格matlab,MATLAB数值分析实验二(复合梯形、辛普森和龙贝格求积,以及二重积分计算等)...
  16. python查询12306余票_使用 Python 在 12306 查询火车票余票
  17. com.documents4j.throwables.ConverterAccessException: The converter seems to be shut down 异常解决方案
  18. iPhone 电池容量怎么算?
  19. 云计算、数据中心的现状和未来发展
  20. (大白话版)子网划分、进制换算

热门文章

  1. educoder MongoDB 复制集 分片
  2. ccs软件linux安装,【图片】【吧主帖】在LINUX(ubuntu)系统下装CCSv6方法(原创)【dsp吧】_百度贴吧...
  3. dataguard日志传输模式解析_日志系统:从ELK到EFK的演进
  4. python灰度处理_python 简单图像处理(14) 灰度图腐蚀和膨胀,开运算、闭运算...
  5. centos bond配置文件示例
  6. vue v-model计算器案例
  7. python利用什么写模板_利用python自动生成verilog模块例化模板
  8. 如何让debuge的dll名字改变_杨石头:如何给品牌取个好名字?
  9. python界面颜色设置_pycharm修改界面主题颜色的方法
  10. 2019年安大计算机专业分数线,2019年安徽