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;

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIE-CCE

1、创建集群 svc网络,10.247 pod网络,10.244 节点网络,192.168.66(master和node一致) 2、创建节点 上面集群选择了最新版本1.27,CCE从1.27版本开始不再支持docker容器引擎,仅支持containered&…

git笔记

git常见命令 git init :初始化本地仓库,会生成一个.git文件,该文件用于管理和追踪该本地仓库,只有在git仓库下的文件才能被管理! git config user. name "用户名” git config user. email " 邮箱” git config -1 :列出当前git仓库…

python接口自动化测试 —— unittest框架suite、runner详细使用

test suite 测试套件,理解成测试用例集一系列的测试用例,或测试套件,理解成测试用例的集合和测试套件的集合当运行测试套件时,则运行里面添加的所有测试用例 test runner 测试运行器用于执行和输出结果的组件 test suite、tes…

Flask(Jinja2) 服务端模板注入漏洞(SSTI)

Flask(Jinja2) 服务端模板注入漏洞(SSTI) 参考 https://www.freebuf.com/articles/web/260504.html 验证漏洞存在 ?name{{7*7}} 回显49说明漏洞存在 vulhub给出的payload: {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__…

【uniapp小程序下载】调用uni.uploadfile方法在调试工具里是没有问题的,但是线上版本和体验版就调用不成功,真机调试也没问题

把你的下载地址前缀添加到合法域名就解决了 在调试工具里成功了是因为勾选了下面这项 下面是我的下载并打开函数 methods: {// 下载downloadFileFn(data) {if (this.detailsObj.currentUserBuy) {uni.downloadFile({// data是路径url: https:// data,success(res) {//保存到本…

未来已来,“码”上见证---通义灵码

为了撰写一份关于通义灵码的产品测评,我将构建一个基于提供的产品介绍和评测内容要求的框架给大家介绍这款产品。 功能使用维度 代码智能生成 使用场景:开发中遇到需要编写新功能、单元测试、或对现有代码进行注释时。 使用效果:预期通义灵…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

前言 在【7.1】管理员图书录入和修改API,当时预告过:并没有写【校验是否是管理员】的逻辑,因为是通用逻辑,会单写一篇来细讲,那么今天就来安排! 角色权限校验,是保证接口安全必备的能力:有权限才可以操作!所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合,那么…

二叉树的前序、中序、后序、层序遍历

参考内容: 五分钟让你彻底理解二叉树的非递归遍历 Python实现二叉树的非递归遍历 二叉树遍历——深度优先(前中后序)广度优先(层序遍历) 构造二叉树 定义二叉树结构如下 struct node {int data;node *left;node *rig…

C++前缀和算法的应用:统计上升四元组

C前缀和算法的应用:统计上升四元组 本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上…

关于网站安全的一些讨论

互联网的普及和发展为企业和个人提供了巨大的机会,但同时也伴随着网络安全威胁的增加。网站被攻击是一个常见的问题,可能导致数据泄露、服务中断和声誉受损。在本文中,我们将探讨与网络安全紧密相关的因素,分析为什么网站容易受到…

Si4010 一款带有MCU SoC RF发射机芯片 无线遥控器

Si4010是一款完全集成的SoC RF发射机,带有嵌入式CIP-51 8051 MCU,专为1GHz以下ISM频带设计。该芯片针对电池供电的应用进行了优化,工作电压为1.8至3.6 V,待机电流小于10 nA的超低电流消耗。高功率放大器可提供高达10 dBm的输出功率…

Linux Crontab 定时任务

crond 服务 Linux 通过 crond 服务来支持 crontab。 查看 crond 服务是否已经安装 输入下面命令确认 crond 服务是否已安装。 systemctl list-unit-files | grep crond 如果为 enabled,表示服务正运行。 crontab 文件 crontab 要执行的定时任务都被保存在 /etc…

seata1.8安装部署

1.在nacos里面创建命名空间 2.下载seata安装包 3.将下载的seata解压,找到seata/script/server/db目录下对应数据库的sql脚本,创建数据库 undo_log.sql CREATE TABLE undo_log (branch_id bigint(20) NOT NULL COMMENT branch transaction id,xid varcha…

3线SPI驱动 HX8347 TFT屏

老五家2.8寸屏,3线SPI驱动 前言 要知道屏幕的驱动芯片都小的惊人,想必是不会打上丝印的。从几百个引脚中判断哪个是哪个,想想就晕。 大佬们都太厉害了,看看PFC就知道屏幕的接线定义。一直好奇这种神技是怎么练成的。也尝试自己来…

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)

前言 趁机把LCD 1602的实验完成了,那个电路图有几个地方没弄懂,但是去掉也没有报错,就没管了。 LCD1602_百度百科 (baidu.com)https://baike.baidu.com/item/LCD1602/6014393?frge_ala LCD1602液晶显示屏通过电压来改变填充在两块平行板之…

动态规划专题——背包问题

🧑‍💻 文章作者:Iareges 🔗 博客主页:https://blog.csdn.net/raelum ⚠️ 转载请注明出处 目录 前言一、01背包1.1 使用滚动数组优化 二、完全背包2.1 使用滚动数组优化 三、多重背包3.1 使用二进制优化 四、分组背包…

混合云中 DevOps 的最佳实践

近年来,出现了各种工具、技术和框架,其目标是增强灵活性、性能和可扩展性。传统的整体方法已被微服务和纳米服务等更加模块化的方法所取代。此外,云计算的兴起导致本地软件被云环境所取代,云环境提供了以前无法提供的广泛优势和功…

Qwt QwtThermo绘制温度计

1.简介 QwtThermo 是一个基于 Qt 框架的类库,用于创建温度计控件。它提供了一些方便的功能来展示和处理温度计相关的数据。 QwtThermo 添加了特定于温度计的功能。 使用 QwtThermo,可以实现以下功能: 设置温度范围:可以通过设置…

【EI会议征稿】第四届智慧城市工程与公共交通国际学术会议(SCEPT 2024)

第四届智慧城市工程与公共交通国际学术会议(SCEPT 2024) 2024 4th International Conference on Smart City Engineering and Public Transportation 第四届智慧城市工程与公共交通国际学术会议(SCEPT 2024)将于2024年1月26-28日…

折叠旗舰新战局:华为先行,OPPO接棒

乌云中的曙光,总能带给人希望。 全球智能手机出货量已经连续八个季度下滑,行业里的乌云挥之不散。不过,也能看到高端市场逆势上涨,散发光亮。个中逻辑在于,当前换机周期已经达到了34个月,只有创新产品才能…