Mysql数据库 8.SQL语言 外键约束
一、外键约束
外键约束——将一个列添加外键约束与另一张表的主键(唯一列)进行关联之后,这个外键约束的列添加的数据必须要在关联的主键字段中存在
案例

创建原则:先创建不含外键的表也就是班级表
添加外键的方式


一般使用第一种,第二种主要用于修改已创建的表为副表,当约束再添加时,也应起名字。
constraint 自定义关键字约束名 foreign key(字段名) references 表名(字段名);
constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
代码实现:
#使用数据库
use fine;#展示数据库
show databases;#展示当前数据库所有表
show tables;#创建数据库
create database db_test1;#使用新建数据库
use db_test1;#显示数据库中某表
desc classes ;#先创建不包含外键的表
create table classes(class_id int(20) primary key auto_increment,#自增操作class_name varchar(40) not null unique,class_remark varchar(200)
);#添加外键表方式一
#创建对应关联的学员表 包含外键
create table students(stu_num char(8) primary key,#主键约束stu_name varchar(20) not null,#非空约束stu_gender char(2) not null,#非空约束stu_age int not null,#不为空cid int not null unique,#约束符合实际constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
);#删除表
drop table students ;
drop table classes ;#已经创建好表如何进行修改
#添加外键表方式二 创建表再修改
#创建对应关联的学员表
create table students(stu_num char(8) primary key,#主键约束stu_name varchar(20) not null,#非空约束stu_gender char(2) not null,#非空约束stu_age int not null,#不为空cid int not null unique#要与另一表中的主键类型对应
);#修改表数据,添加约束,具体的约束名称,关联的表和关联的属性
alter table students add constraint
FK_STUDENTS_CLASSES foreign key(cid)
references classes(class_id);#添加班级数据
insert into classes(class_name,class_remark) values('Java2201','.......');
insert into classes(class_name,class_remark) values('Java2202','.......');
insert into classes(class_name,class_remark) values('Java2203','.......');
insert into classes(class_name,class_remark) values('Java2204','.......');
insert into classes(class_name,class_remark) values('Java2205','.......');
insert into classes(class_name,class_remark) values('C++2206','.......');#添加学员数据
insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220101','张三','男',20,1);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220102','李四','女',19,2);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220103','王五','男',21,3);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220104','赵六','女',22,5);#class表映射于students表中,共有两种方式,可以在创建时约定外键,也可以先创建在修改
二、外键约束——级联
与其他表进行关联了的数据,不能进行修改和删除操作
如何修改与其他表关联了的表数据?
1.将引用了表字段的学生记录中的关联字段修改为NULL;
2.在修改班级信息表中课程信息的id编号
3.在表中关联字段设置为NULL的记录的数据关联字段重新修改为引用字段的新id

代码实现
显示某表
select * from 表名;
显示students表
select * from students s ;

显示班级表
select * from classes c ;

修改操作
update 表名 set 修改的字段 = 修改为 where 限制条件;
update classes set class_id = 7 where class_name ='C++2206';
update classes set class_name = 'Java2206' where class_name ='C++2206';
update classes set class_id = 6 where class_name ='Java2206';

如何修改与其他表关联了的表数据?
——分为三步
#1.先取消此条数据的主外键关系,让外键的id值=null
update students set cid=null where cid = 3;
#2.再更改classes表中曾经引用的班级数据id=7
update classes set class_id =7 where class_name = 'Java2206';
#3.再重新让students表中的数据cid进行外键引用新的id值7
update students set cid=7 where stu_num =20220104;
一步实现:用级联操作实现
#级联操作
#删除students表的外键约束
alter table students drop foreign key FK_STUDENTS_CLASSES;#重新给students表添加外键约束,但是同时要设置级联的修改和删除
alter table students add constraint FK_STUDENTS_CLASSES
foreign key(cid) references classes(class_id)
on update cascade on delete cascade;#添加级联操作,修改/删除一张表时,另一张表会同时修改#级联关系改变时,另一条与他关联的数据也会进行改变
update classes set class_id=3 where class_name ='Java2203';#删除一关联的表
delete from classes where class_id=1;

级联操作:指的是先去删除原有的外键,再去添加外键,并设置级联关系
再去修改/删除时,关联的两条数据同时操作
实现过程



#使用数据库
use fine;#展示数据库
show databases;#展示当前数据库所有表
show tables;#创建数据库
create database db_test1;#使用新建数据库
use db_test1;#显示数据库中某表
desc classes ;#1.先创建不包含外键的表
create table classes(class_id int(20) primary key auto_increment,#自增操作class_name varchar(40) not null unique,class_remark varchar(200)
);#2.添加外键表方式一
#创建对应关联的学员表 包含外键
create table students(stu_num char(8) primary key,#主键约束stu_name varchar(20) not null,#非空约束stu_gender char(2) not null,#非空约束stu_age int not null,#不为空cid int not null unique,#约束符合实际constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
);#删除表
drop table students ;
drop table classes ;#1.先创建不包含外键的表
create table classes(class_id int(20) primary key auto_increment,#自增操作class_name varchar(40) not null unique,class_remark varchar(200)
);#3.已经创建好表如何进行修改
#添加外键表方式二 创建表再修改
#创建对应关联的学员表
create table students(stu_num char(8) primary key,#主键约束stu_name varchar(20) not null,#非空约束stu_gender char(2) not null,#非空约束stu_age int not null,#不为空cid int #要与另一表中的主键类型对应
);#修改表数据,添加约束,具体的约束名称,关联的表和关联的属性
alter table students add constraint
FK_STUDENTS_CLASSES foreign key(cid)
references classes(class_id);#添加班级数据
insert into classes(class_name,class_remark) values('Java2201','.......');
insert into classes(class_name,class_remark) values('Java2202','.......');
insert into classes(class_name,class_remark) values('Java2203','.......');
insert into classes(class_name,class_remark) values('Java2204','.......');
insert into classes(class_name,class_remark) values('Java2205','.......');
insert into classes(class_name,class_remark) values('C++2206','.......');#添加学员数据
insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220101','张三','男',20,1);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220102','李四','女',19,2);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220103','王五','男',21,3);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220104','赵六','女',22,3);#class表映射于students表中,共有两种方式,可以在创建时约定外键,也可以先创建在修改#外键约束————级联
#简单理解:当前两表中关联的数据如要修改需要同步操作
select * from students s ;
select * from classes c ;#修改操作
update classes set class_id = 7 where class_name ='C++2206';
update classes set class_name = 'Java2206' where class_name ='C++2206';
update classes set class_id = 6 where class_name ='Java2206';#关联了的数据,不能进行修改和删除操作
#1.先取消此条数据的主外键关系,让外键的id值=null
update students set cid=null where cid = 3;
#2.再更改classes表中曾经引用的班级数据id=7
update classes set class_id =7 where class_name = 'Java2206';
#3.再重新让students表中的数据cid进行外键引用新的id值7
update students set cid=7 where stu_num =20220104;#级联操作
#删除students表的外键约束
alter table students drop foreign key FK_STUDENTS_CLASSES;#重新给students表添加外键约束,但是同时要设置级联的修改和删除
alter table students add constraint FK_STUDENTS_CLASSES
foreign key(cid) references classes(class_id)
on update cascade on delete cascade;#添加级联操作,修改/删除一张表时,另一张表会同时修改#级联关系改变时,另一条与他关联的数据也会进行改变,将班级名为Java2203的班级,班级序号改为3
update classes set class_id=3 where class_name ='Java2203';#删除一关联的class_id=1的表;
delete from classes where class_id=1;
相关文章:
Mysql数据库 8.SQL语言 外键约束
一、外键约束 外键约束——将一个列添加外键约束与另一张表的主键(唯一列)进行关联之后,这个外键约束的列添加的数据必须要在关联的主键字段中存在 案例 创建原则:先创建不含外键的表也就是班级表 添加外键的方式 一般使用第一…...
ERROR in static/js/xxx.js from UglifyJs Unexpected token name «currentVersion»
添加链接描述 ERROR in static/js/xxx.js from UglifyJs Unexpected token name currentVersion, expected punc 遇到这种异常, 需要运行下面脚本运行npm i -D uglifyjs-webpack-pluginbeta修改webpack.prod.conf.jsjs中引入参数const UglifyJsPlugin require(uglifyjs-webpa…...
反序列化 [网鼎杯 2020 青龙组]AreUSerialz 1
打开题目 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op "1";$filename "/tmp/tmpfile";$content "Hello World!&qu…...
JWT登录校验
工作原理 下面来详细看看 UTF-8 是如何工作的,以及为什么它会根据被编码的字符具有不同的长度。 一、JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 1、客户端使用用户名和密码请求登录 2、服务端…...
python发送企业微信群webhook消息(文本、文件)
import datetime import os import time from copy import copyimport requests from loguru import logger from urllib3 import encode_multipart_formdataclass WeiXin_Robot:def __init__(self,url: str ""):# 测试cartest_url "https://qyapi.weixin.qq.…...
高数笔记06:无穷级数
图源:文心一言 时间比较紧张,仅导图~~🥝🥝 第1版:查资料、画导图~🧩🧩 参考资料:《高等数学 基础篇》武忠祥 🐳目录 🐳常数项级数 🐋概要 &…...
Android工具栏ToolBar
主流APP除了底部有一排标签栏外,通常顶部还有一排导航栏。在Android5.0之前,这个顶部导航栏以ActionBar控件的形式出现,但AcionBar存在不灵活、难以扩展等毛病,所以Android5.0之后推出了ToolBar工具栏控件,意在取代Aci…...
2.3 - 网络协议 - ICMP协议工作原理,报文格式,抓包实战
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ICMP协议 1、ICMP协议工作原理2、ICMP协议报文格式…...
北京陪诊小程序|陪诊系统开发|陪诊小程序未来发展不可小觑
近几年随着互联网快速发展,各行业领域都比较注重线上服务系统,通过陪诊小程序开发可以满足更多用户使用需求,同时还能提高用户使用体验。现在陪诊类的软件应用得到全面推广,在医疗行业当中陪诊小程序更贴近用户生活,可…...
前端面试题总结(一)
1. vue性能优化 v-if和v-show使用:频繁切换使用v-show(display样式),反之使用v-if(删除与新值DOM)v-for必须加key,不能使用index当作key(使用index,如果数组发生变化&am…...
LeetCode107. Binary Tree Level Order Traversal II
文章目录 一、题目二、题解 一、题目 Given the root of a binary tree, return the bottom-up level order traversal of its nodes’ values. (i.e., from left to right, level by level from leaf to root). Example 1: Input: root [3,9,20,null,null,15,7] Output: […...
【大模型应用开发教程】04_大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析
大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析 一、大模型开发整体流程1. 何为大模型开发定义核心点核心能力 2. 大模型开发的整体流程1. 设计2. 架构搭建3. Prompt Engineering4. 验证迭代5. 前后端搭建 二、项目流程简析步骤一:项目规划与…...
【Unity ShaderGraph】| 快速制作一个 表面水纹叠加效果
前言 【Unity ShaderGraph】| 快速制作一个 表面水纹叠加效果一、效果展示二、表面水纹叠加效果三、应用实例 前言 本文将使用ShaderGraph制作一个表面水纹叠加效果,可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity Sh…...
大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法。 Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均…...
用友U8定制版在集简云:无需API即可集成客服系统和用户运营
无代码开发的新时代 在这个信息化、自动化的时代,无代码开发已经成为一种新的趋势。集简云就是这样的一款工具,可以轻松连接用友U8 定制版与近千款软件系统,无需开发、无需代码知识就可以打通各种软件之间的数据连接,构建自动化与…...
APP埋点:页面统计与事件统计
我们平时所说的埋点,可以大致分为两部分,一部分是统计APP页面访问情况,即页面统计;另外一部分是统计APP内的操作行为,及自定义事件统计。 一、页面统计 页面统计,可以统计应用内各个页面的访问次数&#x…...
Kotlin学习笔记-Kotlin基础-01
变量声明 var:用于值不改变的变量,使用val声明的变量无法重新赋值 val:用于值可以改变的变量 变量声明格式 var/val data(变量名称) : Int(变量类型) Kotlin基本数据类: Int、Byte、Short、Long、Float、Double Kotlin类型推…...
gma 1.x 气候气象指数计算源代码(分享)
本模块的主要内建子模块如下: 如何获得完整代码: 回复博主 或者 留言/私信 。 注意:本代码完全开源,可随意修改使用。 但如果您的成果使用或参考了本段代码,给予一定的引用说明(非强制)…...
酒水展示预约小程序的效果如何
酒的需求度非常高,各种品牌、海量经销商组成了庞大市场,而在实际经营中,酒水品牌、经销商、门店经营者等环节往往也面临着品牌传播拓客引流难、产品展示预约订购难、营销难、销售渠道单一等痛点。 那么商家们应该怎样解决呢? 可以…...
蓝桥杯练习
即约分数 题目 思路 遍历所有的x,y,判断x/y是不是即越约分数。 代码 #include <iostream> using namespace std; int gcd(int x,int y) {int r;while(y!0){rx%y;xy;yr;}return x; } int main() {// 请在此输入您的代码int sum4039;//1/y和x/1都…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
