mysql的主键索引为什么不能null

mysql的主键索引为什么不能null

  • 官方文档对null的描述
  • 再看官方文档对 primary key索引的说明
  • 这里的设计其实也是为了符合规范SQL1992
  • 题外话:唯一索引和null

这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读

https://dev.mysql.com/doc/refman/5.7/en/glossary.html

官方文档对null的描述

A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not a number”.) Any aggregate calculation such as AVG() ignores rows with NULL values, when determining how many rows to divide by. The only test that works with NULL values uses the SQL idioms IS NULL or IS NOT NULL.

NULL values play a part in index operations, because for performance a database must minimize the overhead of keeping track of missing data values. Typically, NULL values are not stored in an index, because a query that tests an indexed column using a standard comparison operator could never match a row with a NULL value for that column. For the same reason, unique indexes do not prevent NULL values; those values simply are not represented in the index. Declaring a NOT NULL constraint on a column provides reassurance that there are no rows left out of the index, allowing for better query optimization (accurate counting of rows and estimation of whether to use the index).

Because the primary key must be able to uniquely identify every row in the table, a single-column primary key cannot contain any NULL values, and a multi-column primary key cannot contain any rows with NULL values in all columns.

Although the Oracle database allows a NULL value to be concatenated with a string, InnoDB treats the result of such an operation as NULL.

从这个里面我们可以得出答案,null暗示着数据的缺失,对null的算术运算和相等测试得到的结果还会是一个null。null有点类似IEEE 中浮点数的 NAN not a number的概念(其实有很多数都是NAN)。
从这里我们也可以看出: null == null的结果为 null 而不是 true 是缺失的,可以认为null 不是唯一的,就像 IEEE的浮点数 NAN一样,不是只有一个值的是一族值的总称。

这里还有一点提到了: null通常不被放进索引中,这也是为什么索引会因为null而失效。

再看官方文档对 primary key索引的说明

A set of columns—and by implication, the index based on this set of columns—that can uniquely identify every row in a table. As such, it must be a unique index that does not contain any NULL values.

InnoDB requires that every table has such an index (also called the clustered index or cluster index), and organizes the table storage based on the column values of the primary key.

When choosing primary key values, consider using arbitrary values (a synthetic key) rather than relying on values derived from some other source (a natural key).

See Also clustered index, index, natural key, synthetic key.

这里就很清晰了,主键索引是为了,唯一确定每一条数据,null因为缺失,不知道,所以不能唯一确定每一条数据(因为算术运算得到的是null而不是一个确定的值 而是一个null, 只能进行 IS NULL 和 not null进行运算)。

这里的设计其实也是为了符合规范SQL1992

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

A unique constraint is satisfied if and only if no two rows in
a table have the same non-null values in the unique columns. In
addition, if the unique constraint was defined with PRIMARY KEY,
then it requires that none of the values in the specified column or
columns be the null value.

说白了也是要符合制定的规范。

题外话:唯一索引和null

唯一索引可以有null值,且可以有多个null值, 因为 null 跟 null进行相等的比较的时候,得到结果是 null。如果 null 跟 null进行相等比较的时候得到的结果是 相等的, 那么唯一索引可以拥有一个null值,而不是多个null值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Jmeter】 Report Dashboard 生成html图形测试报告

目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O(Bytes)随时间变化曲线(忽略事务控制器示例结果) …

Web应急思路

Web应急思路 找到webshell --> 确定攻击者IP --> 回溯攻击者操作 --> 梳理整个攻击过程 1.寻找webshell方法 1.文件内容中的恶意函数 2.web日志中的webshell特征 3.贴合web业务中的URL来分析web日志 4.源码版本管理对比,注重修改或新增的脚本文件 5.统计…

有哪些开源和非开源的项目管理工具?

开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具: OpenProject:OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…

http和https的区别?(网络通讯)

HTTP: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种 网络协议 HTTPS: 是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。 两者区别: 1、HTTPS …

# Windows 环境下载 Android 12源码

前言 Android 官网(该方式不适合 Windows 平台):https://source.android.com/source/downloading.html (备注自 2021 年 6 月 22 日起,安卓操作系统不再支持在 Windows 或 MacOS 上进行构建,如果要编译源码推荐先安装…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

C#使用libmodbus库与工业设备进行读写测试

一.编译libmodbus库供C#使用 如何编译?请移步:https://blog.csdn.net/weixin_42205408/article/details/119530811 上面博主的文章除了所写的modbus.cs内的代码有点问题外(可能上面博主和我的Win 10 64位 Visual Studio 2019平台不一样吧&a…

如何在群晖nas中使用cpolar内网穿透?

如何在群晖nas中使用cpolar内网穿透 文章目录 如何在群晖nas中使用cpolar内网穿透 今天,我们来为大家介绍,如何在群晖系统中,使用图形化界面的cpolar。 cpolar经过图形化改造后,使用方法已经简便了很多,基本与其他应用…

为什么流程工业需要合适的预测性维护方案?

在当今工业中,预测性维护是一项至关重要的战略,它能够帮助企业预测设备故障并防止代价高昂的停机。然而,对于流程制造和离散制造来说,选择合适的预测性维护解决方案是至关重要的,因为这两类行业在设备运营和维护方面存…

redis缓存

1.什么是缓存 缓存就是数据交换的缓冲区,称为cache,是存储数据的临时地方,一般读写性能较高 典型例子就是在计算机的CPU和内存、磁盘。CPU的运算能力非常强大,运算速度已经远远超过内存或者磁盘读写数据的能力。但是先读到数据才…

【内网穿透】内网穿透应用场景

伴随着科学技术的进步,我们身边出现了越来越多的电子设备,特别是移动电子设备的普及,给我们的生活带来极大的便利,而软件技术的发展,更为这些软件设备带来更多应用的可能。虽然移动设备覆盖了了我们生活的绝大部分场景…

Mac 补丁管理

Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们,最后将它们推广到生产环境中进行部署来管理 macOS 端点,修补 Mac 设备(又称 Mac 修补)可增强 macOS 环境的安全级别。 什么是 m…

Vue3基础知识(待续)

Vue是什么 构用户界面的js的渐进式框架,基于htlm、css、js,并提供声明式组件化的编程模型,帮你高效开发用户界面。无论简单或复杂的界面Vue都可以胜任。 vue是一个框架,同时也是一个生态。因为有很多程序员支持vue,开…

2023年第四届“华数杯”数学建模思路 - 案例:退火算法

## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低&#…

Git基础知识:常见功能和命令行

文章目录 1.Git介绍2.安装配置2.1 查看配置信息 3.文件管理3.1 创建仓库3.2 版本回退3.3 工作流程3.4 撤销修改3.5 删除文件 4.远程仓库4.1 连接远程库4.2 本地上传至远程4.3 从远程库克隆到本地 5.分支管理5.1 创建分支5.2 删除分支5.3 合并分支解决冲突 参考: Git…

《Kali渗透基础》12. 无线渗透(二)

kali渗透 1:无线协议栈1.1:ifconfig1.2:iwconfig1.3:iw1.4:iwlist 2:无线网卡配置2.1:查看无线网卡2.2:查看信道频率2.3:扫描附近 AP2.4:侦听接口添加与删除 …

键入网址到网页显示,期间发生了什么

HTTP 浏览器做的第一步工作是解析URL 首先浏览器做的第一步工作就是要对URL进行解析,从而生成发送给 web 服务器的请求信息。 所以图中长长的URL实际上是请求服务器里的文件资源。 如果图中的蓝色部分URL元素省略了,那应该请求哪个文件呢? 当…

ARM裸机-12(GPIO和LED)

1、点亮LED 1.1、硬件工作原理及原理图查阅 1.1.1、LED物理特性 LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗…

HTTP 状态码的分类和含义

HTTP(Hypertext Transfer Protocol)状态码是由服务器向客户端传输的 HTTP 响应中的一个三位数字代码。它们提供了关于请求的处理状态和结果的信息。以下是一些常见的 HTTP 状态码及其含义: 1xx 信息响应:指示服务器已收到请求&…

【linux-zabbix】zabbix-agent启动报错:Daemon never wrote its PID file. Failing.

背景: 发现有部分的agent失联,排查发现机器正常,agent没起来。 排查日志发现: # journalctl -xe -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit zabbix-agent.service has begun start…