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

MySQL基础3-约束

MySQL基础3-约束

  • 一. 约束概述
    • 1.1 概念
    • 1.2 目的
    • 1.3 分类
  • 二. 约束演示
  • 三. 外键约束
    • 3.1 概念
    • 3.2 语法
    • 三. 删除/更新行为

一. 约束概述

1.1 概念

约束是作用于表中字段上的规则,用于限制存储在表中的数据

1.2 目的

保证数据库中数据的正确、有效性和完整性

1.3 分类

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

注:约束是作用于表中字段上的,可以在创建/修改表的时候添加约束

二. 约束演示

案例:

根据需求,完成表结构的创建

字段名字段含义字段类型约束条件约束关键字
idID唯一标识int主键,并且自动增长PRIMARY KEY(主键), AUTO_INCREMENT(自动增长)
name姓名varchar(10)不为空,并且唯一NOT NULL(非空), UNIQUE(唯一)
age年龄int大于0,并且小于等于120CHECK(检查)
status状态char(1)如果没有指定该值,默认为1DEFAULT(默认)
gender性别char(1)

演示

-- ------------------------------------------------- 约束演示 ----------------------------------------------------- 创建表students
create table students(id int primary key auto_increment comment 'ID',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 '学生信息表';-- 添加信息
insert into students(name, age, status, gender) values('李雷', 16, '1', '男'), ('韩梅梅', 16, '0', '女');-- 添加第三条信息,将姓名设为null
insert into students(name, age, status, gender) values(null, 17, '1', '男');
# 提示"Column 'name' cannot be null", 姓名不能为空,因为该字段约束为not null-- 再次添加信息,将姓名设为李雷
insert into students(name, age, status, gender) values('李雷', 16, '1', '男');
# 提示"Duplicate entry '李雷' for key 'students.name'", 因为'name'字段约束还有unique,所以不允许出现重复-- 添加年龄大于120的数据
insert into students(name, age, status, gender) values('张三丰', 121, '1', '男');
# 提示"Check constraint 'student_chk_1' is violated.", 因为该字段有'check'约束-- 添加一条没有status的数据
insert into student(name, age, gender) values('张三丰', 30, '男');# 通过查看表的信息,虽然没有设置status的值,但表上给出了默认值'1',因为该字段设置的约束为defaul '1'

注:添加数据失败时,请求已经发出,所以id主键也是自动增长的

三. 外键约束

3.1 概念

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

3.2 语法

添加外键

CREATE TABLE 表名(
     字段名 数据类型
     …
     [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

三. 删除/更新行为

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null值)。
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)。

语法

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE [行为关键字] ON DELETE [行为关键字];

演示

-- no action(当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新, 与restrict一致)
-- 更新/删除演示(确保创建的外键已经删除)
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on no action on delete no action;
-- 测试
delete from where id = 1;
# 此时提示删除失败-- restrict(当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新, 与no action一致)
# 删除外键
alter table emp drop foreign key fk_emp_dept_id;
# 添加行为
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update restrict on delete restrict;
# 测试
update dept set id = 6 where id = 1;
# 同上,修改失败-- cascade(当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录)
# 删除外键
alter table emp drop foreign key fk_emp_dept_id;
# 添加行为
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update cascade on delete cascade;
# 测试1:修改dept表中的id
update dept set id = 6 where id = 1;
# 查看是否修改成功
select * from dept;	# 此时可以看到id为1的研发部此时id为6
# 查看emp表中的dept_id是否更新
select * from emp;	# 表中原本dept_id为1的也更新成6
update dept set id = 1 where id = 6;	#还原
# 测试2:删除dept表中id = 1的数据
delete from dept where id = 1;
select * from dept;	# 此时dept表中id为1的数据已经删除
select * from emp;	# 此时emp表中dept_id为1的数据也全部被删除# 因为emp表中只剩下一条数据,于是将其删掉,参照前面创建表的步骤再次创建emp表并添加数据,这里不做演示
# 将dept删掉的数据补上
insert into dept(id, name) values(1, '研发部');-- set null(当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null, 这就要求该外键允许取null值)
-- 添加行为
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;
# 测试1:修改
update dept set id = 7 where id = 1;	# 此时可以看到emp表中dept_id为1的地方都更新为null
update dept set id = 1 where id = 7;	# 改回来
update emp set dept_id = case when dept_id is null
then 1 when dept_id = 5 then 5 end;	# emp表也改回来
# 测试2:删除
delete from dept where id = 1;	# 

注:图形化界面只需要右键想要添加外键或行为的表,关联到父表进行相关操作即可,在此不做演示

相关文章:

MySQL基础3-约束

MySQL基础3-约束 一. 约束概述1.1 概念1.2 目的1.3 分类 二. 约束演示三. 外键约束3.1 概念3.2 语法三. 删除/更新行为 一. 约束概述 1.1 概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据 1.2 目的 保证数据库中数据的正确、有效性和完整…...

OJ练习第166题——课程表(拓扑排序问题)

课程表 力扣链接&#xff1a;207. 课程表 题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表…...

单臂路由实现VLAN间路由

单臂路由实现VLAN间路由 单臂路由 概述拓扑图PC配置LSW2 接入层交换机LSW3 接入层交换机LSW1 汇聚层交换机R1 路由器ping 测试 单臂路由 概述 单臂路由的原理是通过一台路由器&#xff0c;使 VLAN 间互通数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN 分配一个单独…...

【VSCode】文件模板创建及使用.md

背景 最近使用VSCode学习Vue项目比较频繁&#xff0c;每次创建Vue文件都要手动写重复代码&#xff0c;特别麻烦&#xff0c;就上网查找自动生成代码的说明&#xff0c;结果发现VSCode有代码模板&#xff0c;怪怪&#xff0c;感觉发现新大陆了(low!)。 配置 打开配置 方式一&a…...

【漏洞复现】EnjoySCM存在文件上传漏洞

漏洞描述 EnjoySCM是一款适应于零售企业的供应链管理软件,主要为零售企业的供应商提供服务。EnjoySCM的目的是通过信息技术,实现供应商和零售企业的快速、高效、准确的信息沟通、管理信息交流。。 该系统存在任意文件上传漏洞,攻击者通过漏洞可以获取服务器的敏感信息。 …...

MaPLe: Multi-modal Prompt Learning

本文也是LLM系统的文章&#xff0c;主要是面向多模态的大语言模型&#xff0c;针对《MaPLe: Multi-modal Prompt Learning》的翻译。 MaPLe&#xff1a;多模态提示学习 摘要1 引言2 相关工作3 方法4 实验5 结论 摘要 CLIP等预先训练的视觉语言&#xff08;V-L&#xff09;模型…...

软件测试/测试开发丨Jenkins Pipeline 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/26711 1. Jenkins节点 1.1 常用的节点 内建节点SSH节点Java Web节点 1.1.1 SSH节点配置 远程工作目录 节点中必须有该目录&#xff0c;用于下载和运行j…...

java多线程——线程池

线程池 线程池创建线程池关闭线程池使用获取多个结果 线程池 一个线程池中存在许多准备运行的空闲线程&#xff0c;把Runnable对象交给线程池&#xff0c;会有一个线程调用其run()方法&#xff0c;当调用完后线程不会死亡&#xff0c;而是在池中继续为下一次请求服务 利用线程…...

Linux文件操作

目录 复制文件、目录 cp 移动 重命名文件或目录 mv 创建删除文件 touch rm(remove) 创建删除目录 mkdir(make directory) rmdir(remove directory) 复制文件、目录 cp cp(copy) 同一个目录下复制&#xff0c;所以重命名了一下&#xff1b;把它复制到linuxcast.net/目录下可以…...

Tomcat多实例 + Tomcat负载均衡、动静分离(Nginx联动)

多实例联动 一、Tomcat 多实例1.1 什么是Tomcat多实例&#xff1f;1.2 配置思路1.3 配置实现1.3.1 安装jdk1.3.2 安装tomcat1.3.3 配置 tomcat 环境变量1.3.4 修改端口号1.3.5 修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件&#xff0c;添加 tomcat 环境变量1.3.6 启…...

bootstrap和application的区别

SpringBoot项目的配置文件支持两种四个&#xff1a; bootstrap和application。 YML文件两个&#xff1a;bootstrap.yml&#xff0c;application.yml 属性文件两个&#xff1a;bootstrap.properties&#xff0c;application.properties 配置文件优先级 SpringBoot支持同时使用…...

【狂神】SpringMVC笔记(一)之详细版

1.Restful 风格 概念&#xff1a; 实现方式&#xff1a; 使用PathVariable 在url相同的情况下&#xff0c;会根据请求方式的不同来执行不同的方法。 使用RestFull风格的好处&#xff1a;简洁、高效、安全 2、接受请求参数及数据回显 2.1、请求参数 方式一&#xff1a;这里…...

vue 对axios进行封装

token配置、中英文配置、对所有接口统一设置防抖、对所有post接口统一设置节流 废话少说直接上代码 request.js import axios from axios // 使用element-ui Message做消息提醒 import { ElMessage } from element-plus//这是为了防止刁民反复切换页面&#xff0c;切换页面…...

第十二章 YOLO的部署实战篇(下篇-cuda)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...

原生JavaScript+PHP多图上传实现

摘要 很多场景下需要选择多张图片上传&#xff0c;或者是批量上传以提高效率&#xff0c;多图上传的需求自然就比较多了&#xff0c;本文使用最简单的XMLHttpRequest异步上传图片。 界面 上传示例 代码 index.html <!DOCTYPE html> <html><head><titl…...

企业架构LNMP学习笔记30

1、upstream 中server的关键字&#xff1a;语法&#xff1a; upstream中的分发之后的几个关键字&#xff1a; 1&#xff09;backup 备 其他的没有backup标识的都不可用了&#xff0c;才分发到backup&#xff1b; 2&#xff09;down 此条配置&#xff0c;不会被分发到。 syst…...

数学建模算法汇总(全网最全,含matlab案例代码)

数学建模常用的算法分类 全国大学生数学建模竞赛中&#xff0c;常见的算法模型有以下30种&#xff1a; 最小二乘法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析马…...

openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法

文章目录 openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法概述解决思路备注补充 - 新问题 - N1吸嘴到底部相机十字中心的位置差了很多END openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法 概述 自从用openpnp后, 无论版本(dev/test), 都发现一个大概…...

怎么提高自己当众讲话的能力?

当众讲话是一项重要的沟通技能&#xff0c;它可以帮助你在各种场合中表达自己的观点、影响他人&#xff0c;并建立自信。虽然对很多人来说&#xff0c;当众讲话可能是一项挑战&#xff0c;但通过一些实践和技巧&#xff0c;你可以提高自己的当众讲话能力。下面是一些方法&#…...

孙哥Spring源码第20集

第20集 refresh()-invokeBeanFactoryPostProcessor 四-处理Configuration下的Bean生成代理对象 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、二行InvokeBeanFactoryPostProcessors的作用 registryProcessors&#xff1a;处理的…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...