Mysql数据库 8.SQL语言 外键约束

news2024/11/27 4:21:54

一、外键约束

外键约束——将一个列添加外键约束与另一张表的主键(唯一列)进行关联之后,这个外键约束的列添加的数据必须要在关联的主键字段中存在

案例

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

添加外键的方式 

一般使用第一种,第二种主要用于修改已创建的表为副表,当约束再添加时,也应起名字。

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

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

相关文章

Go 跟踪函数调用链,理解代码更直观

Go 跟踪函数调用链,理解代码更直观 文章目录 Go 跟踪函数调用链,理解代码更直观一、引入二、自动获取所跟踪函数的函数名三、增加 Goroutine 标识四、让输出的跟踪信息更具层次感五、利用代码生成自动注入 Trace 函数5.1 将 Trace 函数放入一个独立的 mo…

day2 ARM基础

.text .globl _start _start:mov r0,#0 mov r1,#0 addfunc:add r0,r0,#1 r0自增1adds r1,r1,r0 R1实现1~100累加cmp r0,#100 判断r0是否到100bleq loop r0等于100 进入死循环 blne addfunc r0等于100跳转至循环累加 loop:b loopstop:b stop.end 【汇编…

win10语言切换调整为像win7一样,设置纯英文键盘切换,使用ctrol+shift切换键盘

文章目录 引入键盘布局说明安装美式键盘去掉微软键盘,修改布局切换快捷键最终效果 引入 我们在玩游戏或者写代码的时候,常常需要使用shift键,而输入法的shift键常常是中英切换按键,这就让人非常不爽了,这里仿照在win7…

JSP(Java Server Pages)

JSP 即 Java服务端页面。 其中既可以定义HTML、JS、CSS等静态内容&#xff0c;还可以定义Java代码的动态内容。也就是JSPHTML Java。 JSP代码简单例子&#xff1a; <html><head><title>Title</title></head><body><h1>JSP,Hello…

java入门,Map<? extends String, ?>

一、前言 是不是平时写业务代码的时候很少用到这个写法&#xff1a;Map<? extends String, ?>&#xff0c;这是Map类型&#xff0c;Map的键是? extends String 类型&#xff0c;值是?。为什么不是我们平时写的Map< String, Object>&#xff0c;这种写法有什么好…

Docker-compose容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compose…

【系统集成项目管理工程师】——5.计算

沟通&#xff1a;沟通渠道数n(n-1)/2&#xff0c;n代表人数 风险 三角分布: 期望[乐观 (小值) 最可能 (中值) 悲观 (大值) ]/3 贝塔分布:期望[乐观(小值) 4*最可能(中值) 悲观(大值) ]/6 标准差[悲观(大值)-乐观(小值) ]/6 方差[悲观 (大值) -乐观 (小值) ]^2/36 概率计算: 士…

DeepLearning - 余弦退火热重启学习率 CosineAnnealingWarmRestartsLR

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134249925 CosineAnnealingWarmRestartsLR&#xff0c;即 余弦退火热重启学习率&#xff0c;周期性修改学习率的下降和上升&#xff0c;间隔幅度逐…

SRAM之ECC检测机制

文章目录 前言一、SRAM简介1. RAM介绍2. SRAM介绍3. SRAM和DRAM的区别4. S32K146系列的SRAM5. LMEM 二、ECC1. EIM模块简介2. 操作步骤1&#xff09;定义反转的读取总线上的Bit&#xff08;Word1&#xff09;2&#xff09;定义反转的CheckBit总线上的Bit&#xff08;Word0&…

Sui浏览器现支持查看已验证的Move源代码

Sui浏览器现在包含了Sui框架包的源代码视图&#xff0c;这是一个备受欢迎的功能。这个新的“已验证源代码&#xff08;Source Verified&#xff09;”选项卡位于现有的“字节码&#xff08;Bytecode&#xff09;”选项卡旁边&#xff0c;使开发人员可以点击查看以下包的源代码&…

SBOM 指南: 是什么及其作用

在软件开发的动态格局中&#xff0c;过去十年见证了两次重新定义了行业轨迹的变革性转变。首先是广泛采用开源软件组件&#xff0c;为开发人员提供大量预先构建的模块&#xff0c;以简化他们的工作。第二个是与DevOps文化的拥抱&#xff0c;自动化和加速软件构建和交付过程。总…

UE5——源码阅读——8——引擎预初始化

初始化文本本地化 执行平台特定的初始化内容 执行应用程序的特定预初始化 将当前的工作目录设置为可执行的目录 处理命令行选项 启用内存保护&#xff08;根据命令行是否启用内存保护&#xff09; 是否启用UE5内存管理的炼狱测试 是否启用UE5内存中有问题的测试 添加bu…

sql中的加减乘除

自学SQL网(教程 视频 练习全套)

C++ PrimerPlus 复习 第九章 内存模型和名称空间

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 &#xff08;上&#xff09; 第四章 复合类型 &#xff08;下&#xff09; 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块&#xff08;上&#xff…

pandas - 数据分组统计

1.分组统计groupby()函数 对数据进行分组统计&#xff0c;主要适用DataFrame对象的groupby()函数。其功能如下。 &#xff08;1&#xff09;根据特定条件&#xff0c;将数据拆分成组 &#xff08;2&#xff09;每个组都可以独立应用函数&#xff08;如求和函数sum()&#xff0…

spark从0到1 基础知识 一文全

spark从0到1 基础知识 一文全 1 开发前准备2 spark架构&#xff0c;任务提交流程3 开发中涉及的python知识 学习中的测试学习代码详情代码请见本人github中的sparkcp项目 https://github.com/defineqq/sparkcp 1 开发前准备 主要是本机使用&#xff0c;所以 安装了个python3&a…

《SpringBoot项目实战》第五篇—接口发生异常如何统一处理

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址&#xff1a;summo-springboot-interface-demo 前言 大家好&#xff01;…

开源六轴协作机械臂MechArm 拖动示教模型案例

介绍 今天&#xff0c;我将向大家展示一个我独立设计并实现的机械臂模型。这个模型的核心功能是实现实时的手势追踪——只需用手轻轻拖拽&#xff0c;机械臂就能立即跟随你的动作进行移动。 我之所以想要创造这样一个模型&#xff0c;是因为在一些危险环境中&#xff0c;我们可…

搭建二维码系统,轻松实现固定资产的一物一码管理

固定资产管理中普遍存在盘点难、家底不清、账实不一致、权责不清晰等问题&#xff0c;可以在草料上搭建固定资产管理系统&#xff0c;通过组合功能模块实现资产信息展示、领用登记、出入库管理、故障报修等功能&#xff0c;对固定资产进行一物一码规范化管理。 比如张掖公路事业…

C++学习之map和set

目录 一&#xff0c;什么是map和set 二&#xff0c;set的使用 插入 键值对 删除&#xff08;erase&#xff09;与查找 lowerbound与upperbound equal_range multiset 三&#xff0c;map的使用 insert 查找 删除 重载[ ] ​编辑 一&#xff0c;什么是map和set C中…