MYSQL表的约束详解!

文章目录

  • 前言
  • 一、空属性
  • 二、默认值
  • 三、列描述
  • 四、zerofill
  • 五、主键
  • 六、自增长
  • 七、唯一键
  • 八、外键


前言

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。


一、空属性

空属性有两个值:

  • null (默认值)
  • not null

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办
法参与运算。

在这里插入图片描述

所以我们在设计数据库表的时候,一定要在表中进行限制,不满足上面条件的数据就不能插入到表中。这就是“约束”。

例如我们创建一个学生信息表,插入有空的数据时就会报错:

在这里插入图片描述

二、默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

例如下面的表将sex 的属性设为default 后,我们如果不插入该属性,就会用默认值。

在这里插入图片描述

但默认值并非什么时候都能省略,如下面这种情况,如果省略将会造成语义歧义然后报错!

在这里插入图片描述

三、列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

对于列的描述,使用desc 查看表的结构时不可见,使用show 可看见:

在这里插入图片描述

四、zerofill

我们创建表时,会发现 int 后会有 (11) 这个数字,我们不理解它的含义:

在这里插入图片描述

但是如果我们添加了 zerofill 属性:

在这里插入图片描述

这次可以看到a的值由原来的12变成0000 0000 12,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是12。为什么是这样呢?我们可以用hex函数来证明。

在这里插入图片描述

五、主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

我们可以在创建表的时候添加主键:

在这里插入图片描述

我们也可以对表进行追加主键,取消主键:

在这里插入图片描述

主键约束:主键对应的字段不能重复,一旦重复,操作失败。

在这里插入图片描述

复合主键:在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

在这里插入图片描述

对于复合主键来说,只有当被设置为主键的多个字段都相同时,才会发生主键约束:

在这里插入图片描述

六、自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

在这里插入图片描述

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

七、唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

验证唯一键约束不能重复:

在这里插入图片描述

验证唯一键可以为空:

在这里插入图片描述

八、外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:foreign key (字段名) references 主表()

我们先建表:

在这里插入图片描述

查看表结构:

在这里插入图片描述

我们先向主键表(myclass)插入两条数据,再向从表(stu)插入两条数据,我们插入class_id=10时成功了,而插入class_id=30时失败了。这是因为class_id被外键(myclass表中的id)约束,既然myclass表中没有id=30,那么stu表中的class_id也不能存在30。这就使所谓的外键约束!

在这里插入图片描述

在业务逻辑上,我们不可能向一个不存在的班级中插入学生信息,所以学生表中的班级需要被外键约束,来排除一些不符合逻辑的操作,这就是外键逻辑的功能!

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

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

相关文章

【服务器】关于lspci指令查看网卡数量的小坑

准备用lspci指令查看服务器上有多少个网卡,但是由于对lspci的输出结果不了解,导致得到了错误的结果,折腾了好几周 T_T 一、什么是lspci指令?如何使用? 1、lspci指令用来查看当前系统连接的所有PCI/PCIe设备 2、使用…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

Android读写文件,适配Q以上

Android Q升级了文件系统,访问文件不仅仅是说动态权限了,有各种限制。权限什么的就不赘述了,下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围:3.6V~100V 高效率:可高达 95% 工作频率:1MHz CS 限流保护电压:250mV FB 电流采样电压:250mV 芯片供电欠压保护:2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head …

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升,数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域,Navicat 16 for MySQL作为一款强大的数据库开发管理工具,正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

Pygame之纯Python实现你好2024效果

Pygame之纯Python实现你好2024效果 前言: 对于某些指JavaScript与前端实现为Python实现你好2024效果的营销号实在看不下去了。无底线营销,还要私信拿源码,hhh 于是就有了以下代码: 运行前安装pygame pip install pygame运行效果…

鸿蒙系统的APP开发

鸿蒙系统(HarmonyOS)是由华为公司开发的一款分布式操作系统。它被设计用于在各种设备上实现无缝的、统一的用户体验,包括智能手机、平板电脑、智能电视、智能穿戴等设备。鸿蒙系统的核心理念是支持多终端协同工作,使应用能够更灵活…

Vulnhub-dc5

靶场下载 https://download.vulnhub.com/dc/DC-5.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 20:56 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00057s latency). MAC Address:…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长,要求简短回复;如果输出过于简单…

STM32(更新中)

目录 1 时钟(心跳) 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器(地址) 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构(推挽/开漏) 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

Redis常见数据类型[上]

目录 前言: 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码: 单线程架构 引出单线程模型: 为什么单线程还这么快? String字符串 字符串数据类型: 常见命令: S…

计算机网络-编制与调制(基带信号 基带传输 宽度信号 宽度传输 编码 调制 )

文章目录 基带信号与宽带信号编码与调制数字数据编码为数字信号数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号小结 基带信号与宽带信号 信道上传输的信号除了可以分为数字信号和模拟信号,也可以分为基带信号和宽带信号,只是分类…

文心一言 VS 讯飞星火 VS chatgpt (188)-- 算法导论14.1 5题

五、用go语言,给定 n 个元素的顺序统计树中的一个元素 x 和一个自然数 i ,如何在O(lgn)的时间内确定工在该树线性序中的第 i 个后继? 文心一言,代码正常运行: 在顺序统计树(也称为平衡二叉搜索树&#xf…

2. HarmonyOS 应用开发 DevEco Studio 准备-2

2. HarmonyOS 应用开发 DevEco Studio 准备-2 首选项设置 中文设置 主题 字体 插件安装和使用 保存时操作 编辑器 工程树管理 代码树管理 标记 字符串可视化编辑 参考文档 常用快捷键 编辑 查找或替换 编译与运行 调试 其他 预览 页面预览 自定义组件预览 预览…

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

linux中配置文件目录为什么用etc来命名

在早期的 Unix 系统中,/etc 目录的名称确实来源于单词 “etcetera” 的缩写,最初意味着 “其他”,用来存放杂项或者不属于其他特定目录的文件。然而,随着时间的推移,/etc 目录的用途逐渐演变并专门化。 在现代的 Linux…

数据监控-Prometheus/Grafana

一、数据监控Prometheus 1、什么是Prometheus Prometheus是由SoundCloud开源监控告警解决方案,从2012年开始编写代码,到2015年github上开源以来,吸引不少用户以及公司的使用。Prometheus作为新一代的开源解决方案,很多理念与Google SRE的运维之道不谋而合。 2、Promet…

Chrome单独配置代理的方法

Windows Windows上单独对Chrome设置代理,需要在启动时传递参数,具体步骤如下。 在Chrome浏览器的快捷方式上右击,进入属性。在 快捷方式 标签下找到 目标 项目,在最后添加 –proxy-server“socks5://xxx.xxx.xx.xx:xxxx” 如果要…

微信小程序之页面导航、生命周期和WXS脚本

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…