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

MySQL基础篇-约束

目录

1.约束概述

 2.分类

3.测试user表的约束情况

主键约束

非空约束及唯一约束

检查约束

默认约束

4.外键约束

外键约束的语法

 外键约束的删除/更新行为

小结


1.约束概述

MySQL约束(Constraints)是用于确保表中数据完整性和一致性的规则。它们定义了数据库表中数据的限制条件,以确保数据满足特定的要求。

 2.分类

  1. 主键约束(Primary Key Constraint):主键是用于唯一标识表中每一行的列或列组合。主键列的值必须是唯一的,且不能为NULL。主键约束确保了表中的每一行都有一个唯一标识符。

  2. 唯一约束(Unique Constraint):唯一约束确保列或列组合中的值是唯一的,但允许NULL值。它用于防止在表中出现重复的数据。

  3. 外键约束(Foreign Key Constraint):外键用于建立表之间的关联关系。外键约束确保一个表中的值存在于另一个表的主键列中。这有助于维护表之间的引用完整性。

  4. 检查约束(Check Constraint):检查约束定义了列中允许的值的范围或条件。它可以用于强制数据的完整性,例如,确保年龄列中的值大于等于18。(版本要求是8.0.16之后)

  5. 默认约束(Default Constraint):默认约束定义了在插入新行时,如果未提供值,则将插入的默认值。这有助于确保表中的数据始终具有某些预定义的值。

  6. 非空约束(NOT NULL Constraint):非空约束确保列中的值不为空,即不能包含NULL值。

平常中的数据表,例如id 它是唯一标识,且不为空 ,并且一般情况下都是自己增长,对这些字段的限制进行一些约束,不满足条件的情况下是无法修改数据表中的数据的。

下面创建一个user表来测试

create table user(id int primary key auto_increment comment  '主键',name varchar(10) not null unique comment '昵称',age int  check ( age > 0 and age <= 120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '用户表'

这个案例几乎把上面的六种约束都用到了,id有主键约束,其中的auto_increment是自增设置,name有非空约束和唯一约束,age则是检查约束,status则是默认约束。

3.测试user表的约束情况

主键约束

插入数据

insert into user(name, age, status, gender) values ('zs',19,'1','男'), ('ls',13,'0','女')

执行完后可以看到并没有插入id,但是因为我们使用的主键约束及自增处理,所以id会自增且会保持唯一性。

进一步验证唯一性可以执行下面的sql,先删除id为2的数据,在插入一个元素

delete from user where id = 2;
insert into user(name, age, status, gender) values ('ww',29,'1','男');

可以看到执行完后id=2的数据虽然呗删除了,但是因为它存在过,为了保持唯一性id会自增到3。

非空约束及唯一约束

按照上面的流程,我们再次插入name为‘ww’的元素,sql执行时会报错

insert into user(name, age, status, gender) values ('ww',29,'1','男');

 执行这样的sql,name字段为null或者不插入

insert into user(name, age, status, gender) values (null,29,'1','男');
insert into user( age, status, gender) values (20,'1','男')

会出现这样的错误

检查约束

 插入这样一条数据,age明显大于了我们要求的范围,此时也会出现对应的错误

insert into user(name, age, status, gender) values ('ll',121,'1','男');

默认约束

 执行这样的sql语句,不插入status,则会填入默认规定的 ‘1’

insert into user(name, age, gender) values ('pp',11,'男');

4.外键约束

 通过前面的分类大概就能知道了外键约束的作用,也就是通过某个字段将一张表与另外一张表关联起来,比如像下面的这种情况。

建表sql:

create table dept(id int auto_increment primary key,name varchar(40) not null comment '部门名称'
) comment '部门表';
insert into dept (name) values ('研发部'),('市场部'),('财务部');create table spm(id int auto_increment primary key ,name varchar(50) not null ,age int,job varchar(40) comment  '职位',dept_id int comment '部门ID'
) comment '员工表';insert into spm ( name, age, job, dept_id) values ('zs',20,'前端',1),('ls',30,'销售',2);

此时这里有一张员工表

以及一张部门表

员工表中的dept_id关联的是部门表,如果此时我们修改其中的数据,因为没有采用外键约束,他们相互之间是不受影响的,这只是一种理论上的约束关联,要想让他们真正的关联起来就要使用到外键约束。

外键约束的语法

 建表时给予外键约束

create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名)
)

因为我在之前就已经建好了表,现在只能采用第二种方法

alter table spm add constraint fk_spm_dept_id foreign key (dept_id) references dept(id);

现在我们想删除部门表中的数据就会出现报错

此时已经建立了联系,为了保证数据的完整性,不能随意的删除数据了,此时就达到了 完整性,一致性的目的了。

删除关联

alter table spm drop foreign key fk_spm_dept_id;

 外键约束的删除/更新行为

外键约束的删除/更新行为主要目的还是为了维护数据的完整性和一致性,并确保表之间的关系得以维护。

常见的有以下这些

  1. NO ACTION:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)。

  2. SET NULL:当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)’。

  3. SET DEFAULT:父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

  4. RESTRICT:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)

  5. CASCADE:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。

案例:

建立cascade连接

alter table spm add constraint fk_spm_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

此时建立连接后,只要修改父表中的数据则与之建立联系的表也会跟着修改,正如上面描述的那样

小结

  1. 约束的作用

    • 约束是一种用于确保数据库中数据的完整性和一致性的重要工具。
    • 它们定义了数据库表中数据的规则和限制,以防止无效或不一致的数据进入数据库。
  2. 主要约束类型

    • 主键约束(PRIMARY KEY):用于唯一标识表中的每一行,确保每个值都是唯一的,同时不允许NULL值。
    • 唯一约束(UNIQUE):确保列中的值是唯一的,但允许NULL值。
    • 外键约束(FOREIGN KEY):用于建立表之间的关联关系,确保引用完整性,防止无效引用和维护数据一致性。
    • 检查约束(CHECK):定义列中允许的值的范围或条件,确保数据满足特定规则。
  3. 主键和唯一约束的区别

    • 主键是一种用于唯一标识行的特殊唯一约束,同时不允许NULL值。
    • 唯一约束确保列中的值是唯一的,但允许一个NULL值。
  4. 外键约束的作用

    • 外键约束用于建立表之间的关系,确保引用的数据在被引用表中存在。
    • 它可以配置为级联更新或级联删除,以维护数据的一致性。
    • 外键约束有助于防止孤立数据和维护数据的完整性。
  5. 检查约束的作用

    • 检查约束定义了列中允许的值的范围或条件。
    • 它用于确保数据满足特定规则,例如日期范围、数值范围等。
  6. 约束的创建和管理

    • 约束可以在表的创建时定义,也可以在后续使用ALTER TABLE语句进行修改或删除。
    • 可以为列级别或表级别的约束,具体取决于约束的作用范围。

在MySQL中,正确使用约束可以帮助您设计更加健壮和可靠的数据库,确保数据的完整性和一致性,同时提供了数据关系的强大功能。深入了解和熟练应用这些约束对于数据库开发和管理非常重要。

相关文章:

MySQL基础篇-约束

目录 1.约束概述 2.分类 3.测试user表的约束情况 主键约束 非空约束及唯一约束 检查约束 默认约束 4.外键约束 外键约束的语法 外键约束的删除/更新行为 小结 1.约束概述 MySQL约束&#xff08;Constraints&#xff09;是用于确保表中数据完整性和一致性的规则。它们定…...

系统工程知识体系(SEBoK)

介绍 《系统工程知识体系》&#xff08;SEBoK&#xff09;是以一种理念设计的&#xff0c;即如果工程师有一个实时更新、实用的指南&#xff0c;他们就能做出更优秀的工作。如果你以前没有使用过这个资源&#xff0c;也没有关系&#xff1b;因为已经有一个完整的指南供你参考&…...

Spring DI (Dependency Injection)

What Is DI? 当一个类需要依赖另一个对象&#xff0c;把另一个对象实例化之后注入给这个对象的过程我们称之为DI # Create an object dependency in traditional programming public class Store {private Item item;public Store() {item new ItemImpl1(); } }# Using …...

Spring Boot : ORM 框架 JPA 与连接池 Hikari

数据库方面我们选用 Mysql &#xff0c; Spring Boot 提供了直接使用 JDBC 的方式连接数据库&#xff0c;毕竟使用 JDBC 并不是很方便&#xff0c;需要我们自己写更多的代码才能使用&#xff0c;一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties &#xff0c;本…...

Wireshark抓包分析ICMP协议

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 分析目的&#xff1a;分析ICMP协议的数据格式、报文…...

C++——安装环境、工具

一、进入官网下载 Visual Studio 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 二、安装 三、安装完后如果出现window SDK 下载失败&#xff0c;可自行下载&#xff0c;如果没有请跳过这一步 Window SDK 官方地址&#xff1a;https://developer.microsoft…...

征稿啦!第 18 届「中国 Linux 内核开发者大会」重磅启动

第十八届中国 Linux 内核开发者大会&#xff08;CLK &#xff09;如期而至。CLK 以“自由、协作、创新”为理念&#xff0c;以开源技术的推广和普及为使命&#xff0c;旨在促进 Linux 内核开发爱好者相互交流&#xff0c;共同进步。 经过组委会公开征集承办单位和各意向承办单…...

JDBC8.0+

首先创建工程&#xff0c;导入jar包 1.注册驱动 //注册驱动//利用反射&#xff0c;较为灵活Class.forName("com.mysql.cj.jdbc.Driver");/**问题&#xff1a;会注册俩次驱动* 解决方案&#xff1a;只触发静态代码块* 触发静态代码块&#xff1a;* 类加载机制&…...

聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型

文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO&#xff08;Blocking IO&#xff0c;BIO&#xff09;2. 同步非阻塞IO&#xff08;Non-blocking IO&#xff0c;NIO&#xff09;3. 异步非阻塞IO&#xff08;Asynchronous IO&#xff0c;AI…...

Linux- 网络编程初探

原始套接字&#xff08;Raw Socket&#xff09; 原始套接字&#xff08;Raw Socket&#xff09;是一种提供较低级别网络访问的套接字。通过使用原始套接字&#xff0c;应用程序可以直接发送或接收网络层如IP的数据包&#xff0c;或者传输层如TCP、UDP的段&#xff0c;而无需通…...

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …...

我想设计一套游戏的奖励系统,有什么值得注意的?

游戏上&#xff1a; 游戏成就系统的价值 游戏中的成就可以延长游戏时间&#xff0c;让玩家不仅仅是将游戏通关&#xff0c;而是必须完成游戏内所有挑战及发现秘密&#xff0c;这些成就可以与游戏本身的目标一致&#xff0c;也可以独立于游戏的主要或次要目标之外&#xff0c;…...

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…...

QT5|C++|通过创建子线程方式实现进度条更新

背景&#xff1a; 一开始是通过在主线程中写一个for循环&#xff0c;每次加1后睡眠1s进行进度条更新。但这样写的结果是 --> 无法动态显示进度条进度。后通过上一篇文章 [ QT5|C|通过信号槽机制实现进度条更新 ] 中的写信号槽机制实现。实现后 考虑了下有没有其他方式实现&a…...

基于mediasoup的webrtc server,性能压测时发现带宽利用率偏低(40%)

基于mediasoup的webrtc server&#xff0c;进行性能压测时发现&#xff0c;在1gbps的网络条件下&#xff0c;带宽利用率在40%(400Mbps)时&#xff0c;就会出现过高丢包率的(packet loss > 10%)的情况。这个结果是合理的吗&#xff1f;如果不合理&#xff0c;要如何提升性能&…...

Ubuntu Redis开机自启动服务

1. 建立service文件 sudo vim /etc/systemd/system/redis-server.service2. redis service文件 [Unit] DescriptionAdvanced key-value store Afternetwork.target Documentationhttp://redis.io/documentation, man:redis-server(1)[Service] Typenotify ExecStart/usr/bin/…...

Stm32_标准库_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电&#xff0c;PB5放置按键&#xff0c;按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…...

MySQL作业:索引、视图、存储、函数

学生表&#xff1a;Student (Sno, Sname, Sex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score) …...

漫谈:C语言 C++ 所有编程语言 =和==的麻烦

这次不只是C语言很麻拐&#xff0c;是所有编程语言都很麻拐了。 赋值和比较是编程语言最基本的操作之二&#xff0c;C和所有类C语言都使用“”和“”来分别表示赋值和比较。 数学上等号“”是个单一的概念&#xff0c;含义是“相等”&#xff0c;左右两边是等价的&#xff0c;很…...

十五、异常(1)

本章概要 异常概念基本异常 异常参数 异常捕获 try 语句块异常处理程序终止与恢复 Java 的基本理念是“结构不佳的代码不能运行”。 改进的错误恢复机制是提高代码健壮性的最强有力的方式。错误恢复在我们所编写的每一个程序中都是基本的要素&#xff0c;但是在 Java 中它显得…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...