精华内容
下载资源
问答
  • 有那么一段时间,我老是该把mysql表的主键指定成什么类型而发愁,原因自然是因为发现项目组里既有指定成bigint类型的,也有指定成int类型的。跟同事就此辩论过,但最后也是没达成一致的意见。 如果你在网上百度...

    受当时知识的局限,本文有些内容可能理解的并不准确确,但主要思想并没问题,鉴于此又写了一篇文章比较深入的聊了一下mysql的底层数据结构和索引等相关内容,地址如下,欢迎批评指正。
    https://blog.csdn.net/nrsc272420199/article/details/104511925


    1 由《java开发手册》引发的思考

    有那么一段时间,我老是在为该把mysql表的主键指定成什么类型而发愁,原因是因为看到阿里巴巴的《java开发手册》中在MYSQL数据库建表规约里有下面这样一条【强制】性的规定:
    在这里插入图片描述
    但是我发现我们部门里数据库表的主键却全是integer,当时就在想难道是因为阿里巴巴的数据量会比较大才这样【强制】规定的么?还有没有其他的原因呢?《java开发手册》不应该是面向广大开发者的么?。。。

    于是上网百度mysql主键int和bigint类型的区别,发现了下面这样一段话:
    在这里插入图片描述
    感觉解释好像也挺合理的。
    —> 于是就有点想不明白了,为什么阿里要【强制】性这样规定呢???
    —> 然后便想到了mysql的索引 —> 想到了B+树 —> 找到了一个可以说服自己的理由。


    2 B树、B+树简单介绍

    首先推荐一个学习数据结构与算法非常好的一个网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html


    2.1 B树

    B树的数据结构如下:
    在这里插入图片描述
    其主要特点为:

    (1)叶子节点和非叶子节点都存储数据
    (2)叶子节点具有相同的深度 —> 多叉平衡树
    (3)叶子节点的指针为空
    (4)节点中的数据key从左到右递增排列


    2.2 B+树

    B+树的数据结构如下:
    在这里插入图片描述
    其特点主要有以下几点:

    (1)非叶子节点不存储数据(数据都在叶子节点),只存储key —> 可以增大度
    (2)非叶子节点仅用作索引 且 和子节点之间存在数据冗余 —> 便于快速定位
    (3)叶子节点用指针连在一起 —> 便于进行范围查找,比如说想查询大于等于30的,找到30之后,后面的数据就可以很快被检索到了。


    2.3 为什么mysql索引的底层数据结构使用B+树而不是B树

    B树和B+树最大的区别主要在于B+树的非叶子节点不存储数据,数据全部在叶子节点, 而B树的叶子节点和非叶子节点都会存储数据。
    而mysql索引的底层数据结构使用了B+树。

    在说原因之前先来看一下mysql根据索引查询数据的过程

    以3.2中查询20为例:
    (1)先将到第一个节点(15,56,77)加载到内存(发生一次磁盘IO),然后在内存中运算发现20在15和56之间
    (2)根据15的指针,将第二个节点(15,20,44)加载到内存(发生一次磁盘IO),然后在内存中运算找到了20对应的索引 —》 如果是B树,会直接返回找到的数据,如果是B+树会走第(3)步
    (3)根据20的指针,将第三个节点(20,25,30)加载到内存(发生一次磁盘IO),然后找到20对应的数据进行返回 — 当然也可能是根据20的指针直接找到20对应的数据,进行返回

    从上面介绍的过程来看,貌似B树比B+树还好一些,因为B树找到数据后就直接进行返回了,要比B+树少了一次磁盘IO,而众所周知的是进行磁盘IO是很耗性能的。

    但是事实如此码??? — 》肯定不是。


    首先我们要知道:

    (1)虽然说在内存里进行操作速度很快,但我们不能一股脑把所有数据都加载都内存;
    (2)mysql规定的每个节点大小是固定的16K(16384B) — 可以通过下面的语句看到

    SHOW GLOBAL STATUS LIKE 'Innodb_page_size';
    

    在这里插入图片描述
    知道了上面两点,其实就可以很容易知道为什么mysql索引的底层数据结构使用了B+树而不使用B树了:

    (1)由于非叶子节点不存数据,这样就可以存入更多的索引值key
    (2)每一个节点存的索引值多了,树的整体高度肯定就低了
    (3)树的高度一低,那发生磁盘IO的次数肯定就少了


    3 阿里【强制】要求mysql表的主键应为bigint unsigned类型原因

    首先应该知道

    (1)mysql索引B+树的高度应为:2-4
    (2)一个bigint类型的数据为8B,一个integer类型的数据为4B,在B+树上每个指针的大小为6B,如下图:

    在这里插入图片描述

    这样的话,对于B+树来说一个非叶子节点能存储的索引的个数为:

    主键为integer类型 : 16384/(4+6) ≈ 1638个
    主键为bigint类型:16384/(8+6)≈ 1170个

    假如每条数据大小为1K(1024B)的话,一个叶子节点就可以存大概16条数据

    那假如B+树的高度为4层的话,那mysql存储的所有数据的条数应为:

    主键为integer类型:1638 * 1638 * 1638 * 16 = 70317217152 大于int的上限42亿
    主键为bigint类型:1170 * 1170 * 1170 * 16 = 25625808000 肯定远小于long的上限,也大于42亿

    也就是说虽然42亿的预留量可能已经非常充足了,但万一不够了呢?

    既然mysql即使是256亿的数据量也仅需4次IO就可以查到,而这个时候int类型的预留量肯定不够了,bigint却十分充足,为什么不用bigint呢???

    我想得可能正是基于这个原因,阿里才会强制要求mysql表的主键应为bigint unsigned类型。

    展开全文
  • 主键允许为空,如果处理数据时未写明id列的数值,则数据是无法插入到数据库中的,oracle一般建议是采用序列的方式,MySQL则采用自增的方式 唯一约束允许为空 ...

    主键,不允许为空,如果处理数据时未写明id列的数值,则数据是无法插入到数据库中的,oracle一般建议是采用序列的方式,MySQL则采用自增的方式

    唯一约束允许为空

    展开全文
  • insert into A (ID,name,age,score,classes) select (select max(cast(ID as signed integer))+1 from A) ,'tom',21,score,classes from A WHERE ID=1017; —varchar 转 int ...cast(id as ...
    insert into
        A
        (ID,name,age,score,classes)
        select (select max(cast(ID as signed integer))+1 from A) ,'tom',21,score,classes
        from A
        WHERE
        ID=1017;
    

    —varchar 转 int 

    cast(id as signed integer)  或者 cast(id as unsigned integer)

    展开全文
  •   Incorrect integer value: '..., 默认sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", 将其修改sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",重启mysql后即可

     

    Incorrect integer value: '' for column 'id' at row 1

     

     

    最近自己在测试一个开源的程序,测试中发现。该程序都添加和更新的时候回出现

    Incorrect integer value: '' for column 'id' at row 1类是的错误! 后来我自己测试了一下: insert into log values('','admin','31','002t') 这样写就会报错: Incorrect integer value: '' for column 'id' at row 1 一般我们是认为应该没错误的。后来查了下MYSQL的资料。发现5以上的版本如果是空值应该要写NULL 这种问题一般mysql 5.x上出现我用的mysql5.1 官方解释说:得知新版本mysql对空值插入有"bug",要在安装mysql的时候去除默认勾选的enable strict SQL mode 那么如果我们安装好了mysql怎么办了,解决办法是更改mysql中的配置 my.ini my.ini中查找sql-mode, 默认为sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", 将其修改为sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",重启mysql后即可

    展开全文
  • ,就成了必填字段 (参考文章) disabled禁选 autocomplete是input框下方的历史记录,需要的话通过off关闭 input框中的提示信息 input框中的日历图标 input框的隐藏:一般用来存储主键id input框中内容的最大长度 ...
  • MySql当查询条件为空作为条件查询

    万次阅读 多人点赞 2018-08-16 11:55:38
    这种情况下,需要去判断每个条件是不是为空,后来发现一个很有用的sql语句,非常简单的解决这个问题。 我们先上表: CREATE TABLE `clazz` ( `id` INT(11) NOT NULL AUTO_INCREMENT CO...
  • 为什么喜欢数据库三范式

    千次阅读 多人点赞 2019-08-12 17:55:14
    插曲 最近,一个远房亲戚的小表弟准备选修专业 找到我问: "哥,现在学数据库有没有前途阿?" "当然有啊,前途大大的呢" "那我现在开始学数据库,需要先从什么开始呢?..."什么主键?" "额.....表弟你...
  • SQlite有个问题,就是主键不能够自动排序。比如说主键id1 2 3 4,共4条记录。现在删除2 3,还剩下1 4记录,当再次插入时,id会变成5,而不是2.假设在初始4条记录的基础上,把这4条记录全都删掉,再次插入时,得到...
  • 问题如图: 使用IE跟踪工具进行跟踪: ...分析原因,可能在arguments[i].GetRowState()这一句,i=2,即DsMain,应该是DsMain里面没设置主键造成; 解决: 重新打开审核界面,审核通过,成功! ...
  • 为什么Excel 用键盘上,下,左,右键光标移动,而是整个表格移动百科-scroll lock如何在鼠标右键添加新建“Excel”表格呢?在桌面空白出鼠标,选择“Excel”表格即可。如果没有此选项按以下操作。1、开始——运行...
  • 我就废话多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ii integer;declare num integer; begin II:=2021-01-16 17:49:22条件查询-模糊匹配...
  • 真正约束字段的是数据类型,但是数据类型约束很单一,需要一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。...1.属性 两个值 :null(默...
  • Kudu : 插入无法获取主键冲突的异常

    千次阅读 2019-09-09 17:07:16
    因为业务需要,想插入Kudu的时候,如果主键已经存在,那么报错,主键冲突异常。 代码如下 ** * kudu的插入 * @author Administrator * */ public class InsertRow { public static void main(String[] args) ...
  • 查询语句过滤空值 过滤空值 如果该值是的 就当做0来处理 SELECT IFNULL(字段名,0) FROM 表名聚合函数 排序 利用ORDER BY 关键字 来 约束表按照什么 条件来排序 ASC代表升序 也是默认的 DESC代表降序 SELECT ...
  • java Api接口判断传入的对象以及对象字段是否为空
  • mysql主键还需要建立索引吗?

    千次阅读 2021-01-20 20:00:09
    我就废话多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ii integer;declare num integer; begin II:=2021-01-16 17:49:22条件查询-模糊匹配...
  • 根据主键ID修改已经存在的数据

    千次阅读 2019-04-16 17:51:28
    对比一下新增的基本思路和修改思路: ...对比之后难发现:修改其实就是比新增多了一个操作数据的回填(也称之数据回显) 上面两张图是修改前和修改后的数据对比(修改了一下学生的图片信息、学生所在...
  • 现在想把所有部门为空的记录更新'制造部',其语update userlist set dept='制造部' where dept='' 但是提示进行了0条记录,再查看记录也没有被更新,知道在sql中,记录用什么表示。我用 字段名=null ...
  • 主要内容什么主键什么是外键?外键的作用是什么?何时可以删除一个外键?主键索引和唯一索引的区别?如何用sql创建一个主键和一个外键?如何删除一个主键?(针对有auto_increment会有所不同)如何对有外键的...
  • -- 主键约束:id int primary key可以唯一确定一张表中的一条记录,也就是通过给某个字段添加约束,就可以使得字段重复且不为空。create table date (id int primary key,sname varchar(20))--联合主键 :primary ...
  • 3. 主键约束 自动增长 4. 外键约束 级联操作 首先我们来想象一下,前几篇文章在我们操作数据库的过程中,自由度是很高的,想给哪个赋值就给哪个赋值,但是这样子,就会造成我们所创建的数据库数据完整,例如我创建...
  • 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign key 1.1 非空约束:not null 1)在创建表时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name非空...
  • 主线程是一个的JFrame ,然后在主线程中新开一个线程, 在这个线程中调用 JOptionPane.showMessageDialog("Message"), 这时会出现如图所示的情况: 这时会出现如图所示的情况: 主要是Swing非线程安全...
  • mysql中可以通过在“CREATE TABLE”语句中,使用“ PRIMARY KEY [默认值]”语句来设置主键约束,使用“ NOT NULL”语句来设置非空约束。mysql主键约束主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用...
  • MySQL数据库的主键和外键详解

    千次阅读 2020-03-20 20:15:42
    MySQL数据库的主键和外键详解 主键 主键的定义 主键:表中经常有一个列或多列的组合,...一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经...
  • DevExperss AspxGridView控件在使用过程中遇到数据条数及分页都显示,单内容为空的情况 找出原因将数据源逐条加载,发现加载前几条都还可以显示,等加载到22条是内容没有显示,之后对比数据发现第22条数据与前...
  • 为了规范数据格式, 在用户进行插入、修改、删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对数据进行监测, 使不符合规范的数据不能进入数据库, 以确保数据的完整性和唯一性 ...
  • mysql设置数据表的主键及自增长的方法:首先启动MySQL,打开navicat建立一个新表;然后添加字段,类型;接着执行相关语句即可插入数据;最后选中字段,在下面的Auto Increment前打上对勾即可自增长。更多相关免费...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,729
精华内容 29,491
关键字:

为什么主键内容不能为空