码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 在哪些场景下不建议自增数据库主键


    ​我们平时建表的时候,一般会像下面这样。

    CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `name` char(10) NOT NULL DEFAULT '' COMMENT '名字', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 复制代码

    出于习惯,我们一般会加一列id作为主键,而这个主键一般边上都有个AUTO_INCREMENT, 意思是这个主键是自增的。自增就是i++,也就是每次都加1。

    但问题来了。

    主键id不自增行不行?

    为什么要用自增id做主键?

    离谱点,没有主键可以吗?

    什么情况下不应该自增?

    被这么一波追问,念头都不通达了?

    这篇文章,会尝试回答这几个问题。

    主键不自增行不行

    当然是可以的。比如我们可以把建表sql里的AUTO_INCREMENT去掉。

    CREATE TABLE `user` ( `id` int NOT NULL COMMENT '主键', `name` char(10) NOT NULL DEFAULT '' COMMENT '名字', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 复制代码

    然后执行

    INSERT INTO `user` (`name`) VALUES ('debug'); 复制代码

    这时候会报错Field 'id' doesn't have a default value。也就是说如果你不让主键自增的话,那你在写数据的时候需要自己指定id的值是多少,想要主键id是多少就写多少进去,不写就报错。

    改成下面这样就好了

    INSERT INTO `user` (`id`,`name`) VALUES (10, 'debug'); 复制代码
    

    为什么要用自增主键

    我们在数据库里保存的数据就跟excel表一样,一行行似的。

    ​而在底层,这一行行数据,就是保存在一个个16k大小的页里。

    每次都去遍历所有的行性能会不好,于是为了加速搜索,我们可以根据主键id,从小到大排列这些行数据,将这些数据页用双向链表的形式组织起来,再将这些页里的部分信息提取出来放到一个新的16kb的数据页里,再加入层级的概念。于是,一个个数据页就被组织起来了,成为了一棵B+树索引。

    ​而当我们在建表sql里声明了PRIMARY KEY (id)

  • 相关阅读:
    Spring Boot 跨域解决方案
    开题报告:基于java企业公司网站系统 毕业设计论文开题报告模板
    Node.js之TCP(net)
    大二Web课程设计 HTML+CSS制作苹果商城网站 Apple商城 8个页面
    详解VQVAE:Neural Discrete Representation Learning
    【紫光同创国产FPGA教程】——【PGL22G第八章】HDMI输出彩条实验例程
    Oracle 的LogMiner
    QT环境下,easylogging++解析配置参数错误的解决记录
    小白还不懂电脑图片转PDF格式怎么弄吗?这些方法你都试过吗?
    MyBatisPlus的使用【详细】
  • 原文地址:https://blog.csdn.net/Java_LingFeng/article/details/128078563
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号