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

news2024/12/24 8:22:43

目录

前言

约束

一.我们为什么需要约束

二.常见的约束类型

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.coloradmin.cn/o/1894056.html

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

相关文章

Qt:5.QWidget属性介绍(Enabled属性-控件可用性设置、geometry属性-控件位置/大小设置)

目录 一、 QWidget属性的介绍: 二、Enabled属性-控件可用性设置: 2.1Enabled属性的介绍: 2.2获取控件当前可用状态的api——isEnabled(): 2.3设置控件当前的可用状态的api—— setEnabled() : 2.4 实例&#xff…

ARM架构 AArch64 基础知识介绍

介绍 aarch64是 ARM 架构的 64 位版本,它是 ARMv8 架构的一部分,被设计用来提供更高的性能和更大的地址空间,同时保持与 32 位 ARM 架构的兼容性。AArch64 是 ARMv8 的 64 位指令集架构(ISA),它提供了丰富的…

【高级篇】第10章 Elasticsearch 集群管理与扩展

在本章中,我们将深入探讨Elasticsearch集群的管理与扩展策略,旨在帮助读者构建一个既能应对大规模数据处理需求,又能保持高可用性和弹性的系统架构。我们将从集群架构设计入手,解析不同节点的角色与配置,然后转向节点发现与配置同步机制,最后讨论水平扩展与容错策略,确保…

arthas命令使用

dashboard(线程、内存等环境概览) jvm(JVM相关信息概览) 1、RUNTIME(系统运行环境JVM相关信息,运行时长等) 2、CLASS-LOADING(类加载信息) 3、 COMPILATION(编译信息) 4…

【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

文章目录 前言:1. 预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解"端口号"和"进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.6 TCP vs UDP 可靠性1.7 网络字节序 2. socket 编程接口2.1 socket 常见API2.…

二叉树的链式访问 与 二叉树专题

目录 二叉树的前、中、后序遍历求二叉树第K层节点的个数二叉树查找值为x的节点leetcode相同的树对称二叉树二叉树的前序遍历另一棵子树牛客 二叉树的遍历 二叉树的前、中、后序遍历 1.前序遍历:先访问根节点,再访问左子树,最后访问右子树 根…

花键参数确定的流程是怎么样的?

继续花键的话题,今天跟小伙伴们一同学习一下:渐开线花键的参数确定的一般流程及基本方法。 前面有好几篇介绍了花键的基本参数的概念,包括规格、模数、齿数、压力角等等。以及花键的定心方式,内外花键的配合方式。那么这些参数的…

抬头显示器HUD原理及特性

HUD基本原理 抬头数字显示仪(Head Up Display),又叫平视显示系统,它的作用,就是把时速、导 航等重要的行车信息,投影到驾驶员前风挡玻璃上,让驾驶员尽量做到不低头、不转头 就能看行车信息。 HUD成像为离轴三反的过程&…

零一万物: Yi Model API的使用

一、获取API Key 通过官方网址注册账号并且认证: 零一万物大模型开放平台 创建API Key 二、安装及调用 安装OpenAI SDK ​ 零一万物API 接口兼容 OpenAI 的 Python SDK,只需要简单配置即可使用。 安装 OpenAI SDK。请确保使用的 Python 版本至少为 3.7.1&a…

ESP32CAM物联网教学06

ESP32CAM物联网教学06 拍照上传互联网 在上节课中,小智的物联网视频小车,在与家用的云台监控摄像头的PK中,各具优势,难分高下,这让小智下定决心,再次增强物联网小车的功能,提升小车的智能水平。…

Lumion专业3D渲染三维场景设计软件下载,Lumion强大的三维渲染软件

Lumion,这款软件具备令人瞩目的渲染速度,能够以闪电般的速度生成令人叹为观止的图像、视频和360全景图,让设计师们能够在短时间内将创意转化为视觉盛宴。 Lumion软件内置了一系列可定制的预先配置的HDR天空环境,这些天空环境不仅丰…

Spring启动时,将SpringContext设置到Util中(SpringContextUtil)

场景 在Spring应用开发中,为简化代码或者在静态方法中获取Spring应用的上下文,需要把SpringContext设置到类属性上。经过对源码的分析和实践,使用Spring的事件监听器监听ApplicationPreparedEvent事件是最佳的方式。 通过ApplicationPrepar…

STM32工业自动化控制系统教程

目录 引言环境准备工业自动化控制系统基础代码实现:实现工业自动化控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景:工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业自动化控制系统利用…

mac 11 变编译安装nginx

mac 11 变编译安装nginx 记录一次安装过程 所需要的包 pcre: https://sourceforge.net/projects/pcre/files/pcre/OpenSSL: https://www.openssl.org/source/Nginx: https://nginx.org/en/download.html如果没有pcre 和Openssl,报错如下 把pcre和Openssl 解压到nginx 目录下…

通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!

引言:在数字化转型中,企业搭建数据分析的报表体系是一个系统性的过程,需要综合考虑业务需求、数据来源、技术平台等多个方面。此外从报表生命周期的角度来说,从产生、使用以及最后消亡退出体系,都需要通盘考虑&#xf…

新手拍短视频的些许建议

1、尽早行动,拒绝完美主义,有手机就能上车,一开始别花太多时间在打磨细节上。总是要准备好了后再做,就总比别人慢一步,可能永远也追不上了; 2、坚持发,度过难熬的启动期就行,不要走…

6个步骤实现Postman接口压力测试(建议收藏)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 这里讲是postman做接口并发测试,基础用法不做赘述 1、第一步接口可以通的情况下点击…

Node.js下载及安装详细教程

目录 Node.js安装详细教程 下载安装环境变量配置文件结构配置npm在安装全局模块时的路径和缓存cache的路径测试常见命令 Node.js安装详细教程 👁官网下载地址:Download | Node.js (nodejs.org) 下载速度慢的话 可以使用网盘下载: https://pan.quark.…

flask项目部署总结

这个部署的时候要用虚拟环境,cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的,(flask,requests,bs4,等等) 最重要的是要写.flaskenv文件并且pip install 一个能运行…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…