MySQL数据库约束你真的懂吗?

news2024/9/25 19:20:24

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识

清风的CSDN博客

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

 一、NULL约束

二、UNIQUE约束 

 三、DEFAULT约束

四、PRIMARY KEY约束

五、FOREIGN KEY约束 

5.1 语法

5.2 案例代码


 

 一、NULL约束

NOT NULL - 指示某列不能存储 NULL 值。

现在我们创建一个student表:

 create table student(id int, name varchar(20));

 可以看到,当我们没有进行约束的时候,id 和 name 都是可以为NULL的。

 当前这个表没有任何的约束,所以在往表里插入NULL的时候也是可以的:

insert into student values (null, null);

那么,现在来修改一下这个student,给这个表加上NOT-NULL约束:

 create table student (id int not null,name varchar(20));

那么现在就可以看到两个表的差别了,第二次创建的表,对于id这一列,是不允许为空的。

所以当我们在插入NULL的时候,有了NOT-NULL的约束,程序就不会正常运行了:

insert into student (null,null);

对于NULL约束,还是比较容易理解的。

二、UNIQUE约束 

UNIQUE - 保证某列的每行必须有唯一的值

 

现在还是创建一个student表,不加任何约束,并插入一个学号为 1 ,名字叫张三的记录:
 create table student(id int, name varchar(20));
 insert into student values (1,'张三');

 再把张三这条记录插入进去:(程序不会报错)

 此时我们创建studenet表时加入UNIQUE约束,并插入张三的记录:

create table student (id int unique, name varchar(20));
insert into student values (1,'张三');

加入UNIQUE约束后,可以看到,id这一列的key是UNI(UNIQUE)的缩写:

因此,加入UNIQUE 约束之后,后续进行插入/修改的时候,都会先进行查询,看当前这个被约束的列的值是否已经存在。约束虽然能够引入更多的检查操作,也会增加系统的开销。

 三、DEFAULT约束

DEFAULT - 规定没有给列赋值时的默认值

进行指定列插入的时候,其他未被指定到的列就会被设成默认值。

 在这里我们还是以上面的student为例,重新创建student表并不加任何约束:

 create table student(id int, name varchar(20));

创建表的时候,我们并没有加任何默认值约束,可以看到student表中的默认值为NULL。

当我们对student表进行指定列插入:

insert into student (id) values (1);
insert into student (name) values ('张三');

这里可以看到,进行指定列插入的时候,没有被指定的列,默认就是为NULL。

此时我们给student表加上DEFAULT约束:

 create table student (id int default 0,name varchar(20) default '无名氏');

这样一来,再次进行指定列插入的时候,没有被指定的列就会被设定为创建表时候给的默认值。

四、PRIMARY KEY约束

PRIMARY KEY - NOT NULL UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。其实就是主键,用来作为一个记录的标识。
现在我们创建一个带有PRIMARY KEY约束的student表:
 create table student (id int primary key,name varchar(20));

需要注意一下,一张表里面只能有一个PEIMARY KEY约束。(非空&唯一)

通常创建表的时候都会指定一个主键。除了上面基础的使用之外,还有一种情况-联合主键,它也是只有一个主键,但是这个主键是由多个列联合构成的。这里不做赘述。

加入主键约束后,插入记录的时候,主键的列是不能为空的:

其次,主键的列的值也是唯一的:
insert into student values (1,'张三');
insert into student values (1,'张三);
//再次插入和第一条同样的记录
insert into student values (1,'张三);

再次插入和第一条同样的记录,程序就会报错,因为记录重复。

五、FOREIGN KEY约束 

FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性

5.1 语法

外键用于关联其他表的 主键 唯一键:
foreign key (字段名) references 主表(列)

5.2 案例代码

创建班级表:

 create table class (class_ID int, name varchar(20));

创建学生表:

create table student (id int, name varchar(20),class_Id int);

班级是要包含学生的,比如说班级现在有这样几个插入的数据:

insert into class values 
   (1,'210701班'),
   (2,'210702班'),
   (3,'210703班');

现在,往学生表里面插入数据:
 insert into student values 
   (1,'张三',1),
   (2,'李四',2),
   (3,'王五',100);

        现在,王五这个同学,不在班级表中存在,因此,这是一个不太科学的数据。而引入外键约束,就是为了解决这个问题。也就是说,希望学生表中的class_ID 都在班级表中存在,此时就可以使用外键约束。

create table class (
 class_ID int primary key,
 name varchar(20));

create table student (
 id int primary key, 
 name varchar(20), 
 class_ID int, 
 foreign key (class_ID) references class(class_ID));

       前面说到的约束,都是在定义表的时候,哪一列需要约束,就创建到哪一列的后面。而外键约束,则是写到最后。即把所有前面的列都定义好了之后,在最后通过FOREIGN KEY创建外键约束。

创建外键的时候,要指定三个信息:

  • 本表哪个列
  • 引用自哪个表(references)
  • 引用自另外一个表的哪个列

此时就要求,本表(student)中这个列的数据必须要在引用的另外一个表的对应列中存在,这个情况下,也可以认为,班级表约束了学生表。把这种约束其他表的表,称为父表,而把学生表这种被约束的表,成为子表。

引入外键之后,就会在对应的父表中检查子表插入的值是否在父表中存在,不存在就报错。其实,外键约束是双向的,父表约束子表,子表也会约束父表。比如:要想删除父表的记录,必须先删除子表对应的数据,确保子表中没有数据引用父表的记录。


✨好啦,今天的分享就到这里!之后,我会给大家分享一些复杂查询,比如联合查询,聚合查询,子查询等。

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

 

 

 

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

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

相关文章

浅谈 JVM GC 收集器--系列(一)

又到一年大促时刻,今天我们一起探讨下JVM垃圾回收的问题,写代码的时候想一想如何减少FullGC问题的出现,因为一旦出现频繁FullGC,短时间内没有太好的解决办法,很有可能重启后服务接着FullGC,导致服务可用率降…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官网并没有提供各个前端框架Vue,React,Angular的直接使用的适配版本, 所以本次使用的vue3-ace-editor 是个人开源者维护的版本,原生是支持 SFC 模版用的,由于我这里习惯使用 JSX 或 TSX的方式&a…

NSGA-III求解微电网多目标优化调度(MATLAB)

一、NSGA-III简介 NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。 参考文献:Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With …

Keil Vision5—新建工程project

注意:创建的工程目录必须是纯英文目录 目录 1.开始配置 2.为该路径下新建个文件夹 3.选择器件 4.工程配置 4.右击魔术棒,设置参数 ​编辑 (1)target配置 (2)output配置 (3)c…

Springboot集成swagger之knife4j

knife4j的最终效果&#xff1a; 支持直观的入参介绍、在线调试及离线各种API文档下载。 1 引入pom <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</ver…

unity3d人物移动一段距离漂移/卡住/卡在最后一帧,站立状态没有动画

在idle1.fbx中动画机选择循环播放&#xff0c;人物静止时播放休闲动画&#xff0c;移动时不停播放run动画

OpenStack云计算平台-认证服务

目录 一、认证服务概览 二、安装和配置 1、先决条件 2、安全并配置组件 3、 配置 Apache HTTP 服务器 4、完成安装 三、创建服务实体和API端点 1、先决条件 2、创建服务实体和API端点 四、创建域、项目、用户和角色 五、验证操作 六、创建 OpenStack 客户端环境脚本…

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f360;操作寄存器实现UART&#x1f35f;UART原理&#x1f35f;编程 &#x1f360;…

数据结构(超详细讲解!!)第二十四节 二叉树(下)

1.遍历二叉树 在二叉树的一些应用中&#xff0c;常常要求在树中查找具有某种特征的结点&#xff0c;或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题&#xff0c;即如何按某条搜索路径访问树中的每一个结点&#xff0c;使得每一个结点仅且仅被访问一次。 …

Vue3 响应式数据 reactive使用

ref 与 reactive 是 vue3 提供给我们用于创建响应式数据的两个方法。 reactive 常用于创建引用数据&#xff0c;例如&#xff1a;object、array 等。 reactive 则是通过 proxy 来实现的响应式数据&#xff0c;并配合 reflect 操作的源对象。 reactive 创建引用数据&#xff1…

外汇天眼:外汇市场中的点差是什么? 又该怎么计算呢?

今天为大家揭开外汇点差的神秘面纱&#xff0c;了解这一外汇交易的核心概念。 定义 外汇点差&#xff0c;简单来说&#xff0c;就是外汇市场上买卖双方报价的差异。 每一笔交易由买卖报价中高低不同的部分构成&#xff0c;高出的部分是买方的盈利&#xff0c;低出的部分则是卖…

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服务器上新建文件夹 测试docker-compo…

OpenStack云计算平台-Dashboard(图形化)

目录 一、安装和配置 1、安全并配置组件 2、完成安装 ​二、验证操作 一、安装和配置 1、安全并配置组件 安装软件包&#xff1a; yum install openstack-dashboard 编辑文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

PPP/INS紧组合算法

前言&#xff1a;在学习紧组合之前学会GNSS/INS松组合是很有必要的&#xff0c;i2NAV团队开源的KF_GINS项目可以作为GNSS/INS松组合学习模板&#xff0c;本文章主要对武汉大学i2NAV发布的PPP/INS紧组合学习资源进行算法层面的总结&#xff0c;链接&#xff1a; 武汉大学多源智…

聚类笔记/sklearn笔记:Affinity Propagation亲和力传播

1 算法原理 1.1 基本思想 将全部数据点都当作潜在的聚类中心(称之为 exemplar )然后数据点两两之间连线构成一个网络( 相似度矩阵 )再通过网络中各条边的消息( responsibility 和 availability )传递计算出各样本的聚类中心。 1.2 主要概念 Examplar聚类中心similarity S(i…

软件工程——数据流图(20分把握在自己手里)【言简意赅】

数据流图【DFD -> Data Flow Diagram】 确定外部实体&#xff1a; 在一个对于某系统的描述中&#xff0c;我们需要分辨的是&#xff0c;该系统的使用人员(或外部设备)&#xff0c;以及系统所反馈的人员(或外部设备)是谁&#xff1f; 这就是外部实体&#xff01;与系统内部处…

新手必看!!附源码!!STM32通用定时器-比较输出PWM

一、什么是PWM? PWM&#xff08;脉冲宽度调制&#xff09;是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

使用Wireshark提取流量中图片方法

0.前言 记得一次CTF当中有一题是给了一个pcapng格式的流量包&#xff0c;flag好像在某个响应中的图片里。比较简单&#xff0c;后来也遇到过类似的情况&#xff0c;所以总结和记录一下使用Wireshark提取图片的方法。 提取的前提是HTTP协议&#xff0c;至于HTTPS的协议需要导入服…

uni-app打包后,打开软件时使其横屏显示

找到page.json文件&#xff0c;在global加入以下代码&#xff1a; 这样就可以横屏显示了。