[Mysql] 的基础知识和sql 语句.教你速成(下)——数据库的约束篇

目录

前言

约束

一.我们为什么需要约束

二.常见的约束类型

NOT NULL 约束

UNIQUE 约束

DEFAULT 约束

PRIMARY KEY

FOREIGN KEY

CHECK约束

原因:

结尾


前言

距离上篇的更新已经快两周了,这个时候大伙都已经考完了吧!现在更新多少有点马后炮,但是没办法呀,笔者是明天考试,所以今天更新也很合理吧!!!!

本来呢,读者想一口气全写完

数据库的约束,聚合查询,联合查询

索引,事物,Mysql 的 JDBC 编程

但是呢,实在是太多了,写完起码话5-6个小时,为了让我偷懒和拥有更好的治疗,我一分为四

这是第一篇,主要介绍约束.

好的好的,现在开始进入正文

约束

一.我们为什么需要约束

约束(Constraints)是用于确保数据库中的数据准确性和完整性的重要机制。

通俗来说,有以下好处

  • 防止错误数据进入数据库

    • 约束就像门卫,确保只有符合条件的数据才能进来。例如,NOT NULL约束确保某列不能有空值,就像你填写表格时,有些栏位是必填的。
  • 确保数据独一无二

    • UNIQUE约束确保一列中的值不能重复。就像一个班级的学生学号,每个学生都有一个独一无二的学号,不能重复。
  • 保证数据之间的关系

    • 外键约束确保两个表之间的关系是正确的。比如,订单表中的客户ID必须在客户表中存在。这样避免了孤立的订单记录。
  • 自动帮你检查数据有效性

    • CHECK约束可以自动检查数据是否符合特定条件。比如年龄字段只能填0到120之间的数字,这样避免了输入不合理的数据。
  • 提高查询速度

    • 主键约束和索引一起用,可以加快数据查询的速度。就像一本书有目录,可以快速找到你需要的信息。(这个在以后的索引也会提到)
  • 确保数据的一致性

    • 约束可以确保数据的一致性和正确性。比如,如果一个学生被删除,那么他的成绩记录也会自动删除。

二.常见的约束类型

常见的约束类型有

NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
好的,接下来我们通过一些实例来理解如果运用
首先,我们建立一个练习用的student 表
create table student (id int,name varchar(20),class varchar(20) primary key);

有ID 列,有姓名列,还有班级列,班级列我们增加了一个 primary key,也就是主键约束

NOT NULL 约束

约束一般加在列的数据类型的后面

NOT NULL 约束顾名思义,有了这个约束以后,列中的值就不能为空了,下面是实例

我们重新建立student表

create table student2 (id int not null,name varchar(20),class varchar(20) primary key);

可以看到,我给 ID列插入了not null 约束,现在,我们试着插入值

insert into student2 values(2,'张三','一班');
insert into student2 values(3,'张三','二班');

效果如图

 假设插一个空值呢?

insert into student2 values(null,'张三','三班');
insert into student2 values(4,null,'三班');

作为控制变量,我们看看结果

这就是 NOT NULL 约束的作用和示例 

UNIQUE 约束

确保所有值在某一列或某几列中的值是唯一的,没有重复。

示例如下,建立一个表,带有unique约束

 create table student3(id int unique, name varchar(20));

 如果插入的数据有重复ID 效果如下


mysql> insert into student3 values(1,'张三');
Query OK, 1 row affected (0.01 sec)mysql> insert into student3 values(1,'张');
ERROR 1062 (23000): Duplicate entry '1' for key 'student3.id'

DEFAULT 约束

如果给一个人为定义的默认值

create table student3(id int , name varchar(20) default '张三');insert into student3 values(1,null),(2,'fxb');insert into student3 (id) values(2);
// 只指定ID列,这时,会启动默认值

效果如图所示

 可以看到,默认值被我们设置为了张三,而不是NULL 了.

PRIMARY KEY

- NOT NULL 和 UNIQUE 的结合。

这意味着它拥有前两个约束的功能,所以笔者就不举例子了,除此以外,他还有如下作用

提高查询性能

主键通常会自动创建一个唯一索引,这使得查询速度更快。当根据主键查找记录时,数据库管理系统可以快速定位到具体的行。这对于大型表格尤其重要,因为它可以显著提高查询性能。

建立表之间的关系

在关系数据库中,主键通常用于在不同的表之间建立关系。通过将一个表的主键作为另一个表的外键,可以实现表之间的关联。这种方式称为引用完整性。例如,订单表可以有一个外键 customer_id,引用客户表的主键 id,从而关联订单和客户。我们接下来可以在外键约束中看到

注意

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

FOREIGN KEY

外键用于关联其他表的 主键 唯一键
说人话,就是之前的约束都是作用在单一表中的,而到了外键约束,就有两张表了,存在父子表
子表的某一列数据范围受到父表的那一列的约束,比如刚刚说的  
      订单表可以有一个外键 customer_id,引用客户表的主键 id,从而关联订单和客户。
这里,订单表就是我们的子表,而我们的客户表就是父表, 订单表中的每个ID,都要在客户表中找得到,
确保订单是对的.
如果还是看不懂,就看到我们的一开始建立的student 表
create table student (id int,name varchar(20),class varchar(20) primary key);

 我们以 class 作为外键,引用父表的 主键classid , 确保我们学生所在的班级,肯定是班级表里的班级,避免有错误没人能发现.   

(即子表的列为外键,引用父表的主键)

好的,那我们现在去建立父表吧

CREATE TABLE class (classid int PRIMARY KEY,classname VARCHAR(20)
);

然后删除学生表,重新关联

CREATE TABLE student (id int,name varchar(20),class int,PRIMARY KEY (class),FOREIGN KEY (class) REFERENCES class(classid)
);

记住我们的写法,将子表的某一列作为外键(foreign key) 去 referen 父表的 某一列

也同样记住作用,以上述例子为例,一旦关联成功以后,子表student 关于class 的数据都必须在父表的classid 中出现过,否则,是无法插入的

接下来,我们将举例分析

mysql> insert into class values(110,'一班');
Query OK, 1 row affected (0.01 sec)mysql> insert into class values(111,'二班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(112,'三班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(113,'四班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(114,'五班');
Query OK, 1 row affected (0.00 sec)

我们给class 表插入以下五个数据

 接下来,我们试着给子表插入一些数据,看看是否符合上述所言

mysql> insert into student values(1,'张三',110);mysql> insert into student values(2,'李四',111);mysql> insert into student values(2,'王五',112);mysql> insert into student values(2,'赵六',102);

他们的结果如下

mysql> insert into student values(2,'赵六',102);ERROR 1452 (23000): Cannot add or update a child row:a foreign key constraint fails 
(`connect`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`) 
REFERENCES `class` (`classid`))

 

 可以看到,只要父表中没有对应数据,就加不上去

除此以外,还有一个作用

如果你要修改/删除父表中的值,但是这个值已经被子表引用了,你就无法删除/修改

以删除举例

mysql> delete from class where classid=110;

结果只会是

ERROR 1451 (23000):Cannot delete or update a parent row: a foreign key constraint fails 
(`connect`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`)REFERENCES `class` (`classid`))

同样,你也无法把表给删了

mysql> drop table class;
ERROR 3730 (HY000):Cannot drop table 'class' referenced by a foreign key constraint 'student_ibfk_1' on table 'student'

注意

使用外键约束的时候,父表的那一列需要有 unique 或者 primary key 修饰,子表没有这个要求

关于 外键约束,写的有点乱,大伙凑合着看

CHECK约束

这个呢MySQL使用时不报错,但忽略该约束:

原因:

MySQL 的设计理念中,目前并没有实现 CHECK 约束的完全功能。CHECK 约束通常用于在插入或更新数据时,对指定列的值进行条件检查,只有满足条件的值才能被接受。这在其他一些关系型数据库管理系统(如 PostgreSQL)中是支持的。

结尾

好的,下篇中的约束篇写完了,下次更新聚合查询和联合查询篇.

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

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

相关文章

Spring源码十:BeanPostProcess

上一篇Spring源码九:BeanFactoryPostProcessor,我们看到ApplicationContext容器通过refresh方法中的postProcessBeanFactory方法和BeanFactoryPostProcessor类提供预留扩展点,他可以在Spring容器的层面对BeanFactroy或其他属性进行修改&#…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期,全国多地暴雨持续,“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜,让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑,潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

MYSQL的简易安装

先下载好安装包 官网:https://www.mysql.com 双击运行进入界面 打开之后将左侧的产品移到右侧 点击使用的产品设置路径 之后一直下一步即可 选择主机类型 同时要记住端口号 设置密码 设置系统服务列表中的服务名称 之后一直下一步就可以了 安装完成记得配置环…

解决前端登录成功之后,往后端发请求携带cookie问题

项目背景: 今天在做伙伴匹配系统: 我现在实现的功能是: 在我登录成功之后,就进入了主页(默认页),在我访问用户页的时候产生的问题 首先说明一下这个Cookie的问题: 我们登录成功…

Echarts折线图 自适应窗口大小

实现效果&#xff1a; 代码&#xff1a; <template><div class"echarts"><div class"select-box"><div v-for"(item,index) in trendList":key"index":class"[period item.id?active:,item]"click&…

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

Python 项目依赖离线管理 pip + requirements.txt

背景 项目研发环境不支持联网&#xff0c;无法通过常规 pip install 来安装依赖&#xff0c;此时需要在联网设备下载依赖&#xff0c;然后拷贝到离线设备进行本地安装。 两台设备的操作系统、Python 版本尽可能一致。 离线安装依赖 # 在联网设备上安装项目所需的依赖 # -d …

cuda编程快速了解

原文链接 https://zhuanlan.zhihu.com/p/34587739 一、Gpu的线程结构 要深刻理解kernel&#xff0c;必须要对kernel的线程层次结构有一个清晰的认识。首先GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程&#xff0c;一个kernel所启动的所有线程称…

2024年过半,新能源车谁在掉链子?

2024年过半之际&#xff0c;各品牌上半年的销量数据也相继出炉&#xff0c;是时候考察今年以来的表现了。 理想和鸿蒙智行两大增程霸主占据头两名&#xff0c;仍处于焦灼状态&#xff1b;极氪和蔚来作为高端纯电品牌紧随其后&#xff0c;两者之间差距很小&#xff1b;零跑和哪…

Truenas scale入坑

家里有一台刚上大学时配的电脑&#xff0c;看着无用武之地&#xff0c;又还能用&#xff0c;于是想那它来搞个私有云nas。 一、选择想要入的坑 一开始对这块没什么了解和概念&#xff0c;最早是在旧主机上安装了个Ubuntu&#xff0c;然后再安装CassOS小尝试了下。可能CassOS里…

商家转账到零钱申请必过办法详解

微信支付平台会对商家转账到零钱的申请进行严格审核&#xff0c;以确保符合相关规定和政策。但可以通过专业机构协助并遵循正确的流程来实现一次通过&#xff0c;以下是一些建议&#xff1a; 1. 确认主体资格&#xff1a;申请商家转账到零钱必须为企业主体&#xff08;有限公司…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号&#xff0c;软件将编译生成的雷达信号任意波数据下载到信号发生器中&#xff0c;主要是1466-V矢量信号发生器&#xff0c;可实现雷达信号模拟产生。软件可模…

HDFS读写流程详细过程

HDFS读写流程详细过程 HDFS的定义一、组成架构二、优缺点三、读流程四、NameNode和SeconderyNameNode五、写流程 HDFS的定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目录树来定位文…

opencv实现人脸检测功能----20240704

opencv实现人脸检测 早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。OpenCV 的官方版本中包含了一个更准确、基于深度学习的人脸检测器, 链接:基于深度学习…

码云项目如何弄到gitlab上面

码云项目如何弄到gitlab上面 git remote -v 可查看当前的远程仓库git remote remove origin 删除当前的远程仓库git remote add origin gitXXXX:XXXX/shares.git 添加新的远程仓库 这个是你在远程gitlab上面创建的一个空仓库的ssh 地址git remote -v 验证新的远程仓库是否添加…

C++之boost智能指针

1、boost智能指针 资源获取即初始化&#xff1a;在构造函数中对资源进行初始化&#xff0c;在析构函数中释放。 智能指针的本质思想是&#xff1a;将堆对象的生存期&#xff0c;用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候&#xff0c;立刻用智能指针…

AI免费文档处理在线工具:文档总结;论文阅读

1、文档总结 NoteGPT 支持各种类型文档ppt、word、pdf等总结 https://notegpt.io/pdf-summary 另外各种大模型工具一般都支持文档上传总结&#xff1a; 例如kimi、通义等 参考&#xff1a;https://blog.csdn.net/weixin_42357472/article/details/138205261 2、论文阅读 h…

plugin:vite:import-analysis]No known conditions for“./lib/locale/lang/zh-cn“

将原有引入&#xff1a; import zhCn from element-plus/lib/locale/lang/zh-cn 改成&#xff1a; import zhCn from element-plus/es/locale/lang/zh-cn; 原因版本升级&#xff0c;引入路径改变&#xff08;原先的包在node_modules\element-plus\lib找不到&#xff09; 新…

c++习题09-分离整数的各个数

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 二&#xff0c;思路 一开始我想到的是将简单容易输出的1000以内的数先进行相应的运算&#xff0c;再输出之后再对1000以上的数字进行判断&#xff08;主要还是想先将很大的数变小&#x…

如何自动筛选螺丝不良品?

四角螺丝是一种特殊设计的螺丝&#xff0c;其螺纹头部呈四个平行的角状结构&#xff0c;与传统的六角螺丝相比具有独特的外观和功能。这种设计使得四角螺丝在安装和拆卸时更容易使用&#xff0c;并提供了更好的扭矩传递效率。四角螺丝头部呈现四个平行的角&#xff0c;与常见的…