[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)中是支持的。

结尾

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes基于helm安装 harbor

Kubernetes基于helm安装 harbor 之前harbor的安装都是借助docker完成一键安装部署,安装完成之后harbor组件均运行到一台机器上面,本文实践harbor在k8s环境中的部署。 准备工作 根据harbor官方要求: Kubernetes cluster 1.20Helm v3.2.0 …

精准定位推广盲点?Xinstall数据监测让每一分投入都见成效!

在这个数字化时代,App的推广早已不再是简单的“上线即成功”。面对激烈的市场竞争和日益挑剔的用户,如何精准监测推广数据,优化营销策略,成为了每个开发者与营销人员不得不面对的挑战。而在这个关键时刻,Xinstall作为一…

shark云原生-日志体系-filebeat高级配置(适用于生产)

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示(hints)的自动发现支持的 **hints**的完整列表&…

2024 AI工程师世界博览会

6月24日至6月27日在旧金山举行的 AI 工程师世界博览会是AI 从业者和爱好者的首要活动之一。本次年度会议展示了人工智能技术的最新进展,并提供了对行业趋势的宝贵见解。 模型不是壁垒 大型语言模型(LLMs)的快速发展是会议的中心主题。OpenAI…

element-ui Tree之懒加载叶子节点强制设置父级半选效果

效果: 前言: 我们是先只展示一级的,二级的数据是通过点击之后通过服务器获取数据,并不是全量数据直接一起返回回来的。 问题: 当你设置了默认选中的子节点,但是由于刚进入页面此时tree中数据暂是没有这个…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总:入门与实战 前言:在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大,导致训练效果很差。在图像生成任务中并不明显,但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

代码随想录算法训练营第69天:图论7[1]

代码随想录算法训练营第69天:图论7 109. 冗余连接II 卡码网题目链接(ACM模式)(opens new window) 题目描述 有向树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节…

5分钟读懂GPS-RTK实时动态技术,建议收藏!

由于”智慧工地“理念的兴起和发展,目前越来越多的企业将信息技术手段融合于施工现场安全管理,构建智能化的安全监管模式。基于此,蓝牙LORA融合定位技术、UWB超宽带定位技术、GPS-RTK定位技术等信息技术也越来越频繁出现在大众视野。然而&…

单片机软件架构连载(4)-结构体

枚举、指针、结构体,我愿称为C语言"三板斧"。 用人话来讲,几乎所有c语言高阶编程,都离不开这这3个知识点的应用。 今天站在实际产品常用的角度,给大家讲一下结构体。 1.结构体概念 结构体可以用来构建更复杂的数据结…

Diffusion模型的微调和引导

留意后续更新,欢迎关注微信公众号:组学之心 Diffusion模型的微调和引导 微调(fine-tuning): 从一个已经训练过的模型开始训练,我们就可以从一个学会如何“去噪”的模型开始训练,相对于随机初始…

c++:动态内存变量

典型的C面向对象编程 元素 (1)头文件hpp中类的定义 (2)源文件cpp中类的实现(构造函数、析构函数、方法) (3)主程序 案例 (1)用C来编程“人一天的生活” (2)“人”的属性:name、age、male (3)“人”的方法:eat、work(coding/shop…

【免费可视化工具】助力风电行业智能化管理

在绿色能源日益成为全球共识的今天,风电作为清洁能源的重要组成部分,正以前所未有的速度发展。然而,随着风电场规模的扩大和数量的增加,如何高效、直观地管理和监控风电资源成为了一个亟待解决的问题。 而山海鲸可视化这款免费可…

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理

基本参数: 机器型号:HGLM2200N 产品名称:A4黑白激光多功能一体机 基础功能:打印、扫描、复印 打印速度:22页/分钟 纸张输入容量:150-249页 单面支持纸张尺寸:A4、A5、A6 产品尺寸&#x…

功能详解-电商接口丨电商API

随着电商平台各类机制日益成熟,电商接口逐渐被大家所熟知,淘宝、天猫、京东、拼多多、抖店、快手、小红书这些都是主流的电商平台,为了提升电商管理系统的效率,开发者可以通过电商接口将多个电商平台的数据和功能集成。 电商接…

firewalld高级配置

一、1、关于iptables的知识 IP数据包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是做数据包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的数据包过滤表中,而这些表集成在Linux内核中。在数据…

二手物品交易小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,管理员管理,商品信息管理,论坛管理,收货地址管理,基础数据管理 微信端账号功能包括:系统首页,商品信息&…

ESIX挂载usb移动硬盘或者优盘并拷贝原数据存储数据

1、esxi支持和不支持分区格式 ESXi 6.*系列默认不支持NTFS、exFAT等常见文件系统,fat32支持但没意义仅小文件可以用,不过可以通过一些额外步骤和第三方工具来访问NTFS格式的存储设备,但生产环境不推荐这样做,需要安装第三方包。 e…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队,竞赛规模体量大致相当于2024年认证杯,1/3个妈杯,1/10个国赛。赛题难度大致相当于0.6个国赛,0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…

中霖教育:税务师考试报名现有职称怎么写?

【中霖教育怎么样】】【中霖教育好吗】 报考税务师考试的考生在报名期间需要登录税务师职业资格考试网上报名系统填写报名信息。 税务师报名现有职称按照实际情况填写会计助理、会计或者会计主管,没有工作的考生在填写工作信息的时候填写待业即可。 在报名阶段&a…

Linux_进程池

目录 1、进程池基本逻辑 2、实现进程池框架 3、文件描述符的继承 4、分配任务给进程池 5、让进程池执行任务 6、回收子进程 7、进程池总结 结语 前言: 在Linux下,进程池表示把多个子进程用数据结构的方式进行统一管理,在任何时候…