当前位置: 首页 > news >正文

MySQL —— 约束

MySQL —— 约束

  • 引言
  • not null
  • unique
  • primary key —— 主键
    • auto_increment
    • 复合主键
  • foreign key —— 外键
    • 插入数据
    • 删除主表的数据
  • default

引言

在设计表的时候,有些列是必填项(如果用户不填,那这个数据就没有必要存进数据库),可能表的第一列就是编号需要能自动帮我们排序(这样可以减少用户的填写负担,也减少我们的工作量),又或者我们需要有些数据是不能重复填写的(例如身份证号,每一个人都是独一无二的)等等… 这些需求其实都可以实现,现在我们来学习数据库是如何实现约束的。

not null

表示某一列是不能存储 null 值的,也就是这一列是必填项:

格式:在你定义表的时候,在需要不为空的列旁边加上 not null 即可

在这里插入图片描述

我们查看表结构发现 Null 那一列的 id 对应的一行现实 No ,说明定义成功,现在我们插入一个 id 为 空的数据实验一下:

在这里插入图片描述

会发现不允许你插入 id 为空的数据。

unique

保证某列的每一行都有一个唯一值,即不可以在某列上出现重复的数据

语法格式:在你定义表的时候,在需要的列旁边加上 unique 即可

在这里插入图片描述

我们来查看表结构:

在这里插入图片描述
我们发现 id 那一行的 Key 值被置为了 UNI ,说明 id 是唯一值,如果插入id 相同的数据,数据库会报错:

在这里插入图片描述


null 是可以重复的,不受 unique 约束

在这里插入图片描述

primary key —— 主键

primary key(也被我们称为主键) 是 not null 和 unique 的结合(即主键约束的列即是非空的也是唯一的),能确保某列(或者两列及以上的列的组合) 有唯一的标识。

我们可以使用 not null + unique (没有顺序之分)来创建主键:

在这里插入图片描述
在这里插入图片描述

Key 显示 PRI 就是主键的意思


当然这里可以直接使用关键字 primary key 来定义主键 :

在这里插入图片描述

主键约束帮我们对非空和唯一值进行了校验,对于这个性能消耗来说,我们还是能接受的。


auto_increment

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,数据库使用最大值+1 对其进行赋值

语法格式就是在主键后面加 auto_increment

在这里插入图片描述
在这里插入图片描述

我们查看表结构可以看到 Extra 这个扩展列表里出现了 auto_increment ,说明 id 这一列数据会自增,其实可以类比我们的excel 表格,现在给大家演示自增的现象:

在这里插入图片描述


数据库会帮我们维护主键的增长,在插入的时候,找到目前的最大值,然后在这个基础上 +1 即可。

我们在插入一个id 定义为 100 的数据,然后再插入只有姓名的数据,看看现象:

在这里插入图片描述

在这里插入图片描述

这里说明了主键可以是不连续的


现在我们清空 test 表中的所有数据,如果我们第一个插入的数据的 id 值为 null ,数据库其实也能帮我们插入进去:

在这里插入图片描述
在这里插入图片描述

empty set 表示空集。

这个 id 生成的数值是上次 id 的最大值加 1 。


现在我们来定义一个新的表,来试一下 第一个插入的数据的 id 值为 null:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果是全新的表,插入第一个数据的主键值为 null,会自动赋值为 1
如果后序还是插入主键值为 null 的数据,数据库会为其赋值为最大值加 1

在这里插入图片描述

复合主键

注意一个表中只能存在一个主键

但是一个主键可以同时包含很多个列,这就是复合主键

如何定义符合主键?
在创建表的时候,加上 primary key (列名,列名…)

在这里插入图片描述

通过查看表结构可以看到两个列被主键管理着:

在这里插入图片描述


复合主键在做非空校验的时候,所有被主键管理的列都不能被定义为空,但是在做唯一性检验的时候,只有当所有被主键管理的列的数值都相同时,才不会被允许插入。

演示一下:

现在插入两个数据:
在这里插入图片描述

再插入主键值相同的张三数据:
在这里插入图片描述
发现插入不了,因为 1, 张三 被主键唯一值校验发现,无法插入

但是你可以插入,主键值不完全相同的张三数据:
在这里插入图片描述

foreign key —— 外键

外键用于关联其他表的主键或唯一键

举个例子:
在这里插入图片描述

设置外键的语法格式:foreign key (字段名) references 主表(列)

foreign key 是外键的关键字,字段名是表实当前表中哪个字段要与主表建立主外键关系,references 关键字,表实后面要引用哪个表中的哪个列。

演示:

create table class (id int primary key comment '班级',num int comment '人数'
);create table student (id bigint primary key comment '学号',name varchar(50) comment '姓名',class_id int comment '班级',foreign key (class_id) references class(id)
);

注意被关联的表要先创建好,然后才能创建与其构建主外键关系的表

外键一定是关联另一张表的主键的

插入数据

在这里插入图片描述

我们往 student 表中 插入 一个不存在的班级编号的数据:
在这里插入图片描述
发现这是不能插入的

通过外键的约束,可以保证数据的完整性和关系的确定性。

删除主表的数据

在这里插入图片描述
在这里插入图片描述

首先先确定 class 是主表,因为它是被关联的,student 是 子表

当子表存在对主表依赖的数据的时候,不能删除主表对应的数据
在这里插入图片描述
因为 231 与子表存在关联,所以主表的 231 数据不能被删除

但是可以删除没有关联关系的数据
在这里插入图片描述

如果一定要删除主表的存在关联关系的数据的时候,那么子表就不能存在有数据行对其有依赖,所以先删除子表的数据行解除关联关系,再去删除主表的数据:
在这里插入图片描述

default

给没有赋值的列 赋默认值。

语法格式:在你定义表的时候,在指定的列旁边加上 (default + 默认值) 即可

在这里插入图片描述

查看表结构发现 Default 列表对应的 name 出现了 默认值为 无名氏,也就是当你没有填姓名的时候默认值会默认为 无名氏。

在这里插入图片描述

演示一下:

如果你有设置name 这个数值,那就不会赋默认值

在这里插入图片描述


如果你没有设置name 这个数值,就会赋默认值——无名氏:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 周报 | 24.8.5-24.8.11文章汇总
  • Ubuntu安装MySQL5.7 + Apache + PHP + 禅道 保姆及教程
  • 糟糕界面集锦-控件篇05
  • XML动态sql查询当前时间之前的信息报错
  • 【数据结构进阶】哈希的应用
  • Matlab-use-yalmip-and-cplex12-10/
  • Flink开发语言选择:Java vs Scala,哪种更适合你的项目?
  • RAG与LLM原理及实践(11)--- Milvus hybrid search 源码分析及思想
  • 操作符5 学习编程的第23天
  • vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称
  • 【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置
  • Web详解
  • 初识CSS(三)
  • redis超过内存大小是否会挂?
  • 怎么将mov视频转换成mp4?将mov视频转换成mp4的方法
  • gf框架之分页模块(五) - 自定义分页
  • Js基础知识(四) - js运行原理与机制
  • JS学习笔记——闭包
  • Kibana配置logstash,报表一体化
  • node.js
  • PHP的类修饰符与访问修饰符
  • Python学习之路16-使用API
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring boot下thymeleaf全局静态变量配置
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 订阅Forge Viewer所有的事件
  • 回流、重绘及其优化
  • 技术发展面试
  • 前端之Sass/Scss实战笔记
  • 嵌入式文件系统
  • 日剧·日综资源集合(建议收藏)
  • 通过git安装npm私有模块
  • 一道闭包题引发的思考
  • 因为阿里,他们成了“杭漂”
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 追踪解析 FutureTask 源码
  • 自动记录MySQL慢查询快照脚本
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #Spring-boot高级
  • (1)SpringCloud 整合Python
  • (10)ATF MMU转换表
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (23)Linux的软硬连接
  • (26)4.7 字符函数和字符串函数
  • (33)STM32——485实验笔记
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (一)SvelteKit教程:hello world
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)视频码率,帧率和分辨率的联系与区别
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .Mobi域名介绍