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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
93 15
|
7天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
14天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
17天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
55 3
|
18天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
20天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
21天前
|
SQL Oracle 关系型数据库
SQL(MySQL)
SQL语言是指结构化查询语言,是一门ANSI的标准计算机语言,用来访问和操作数据库。 数据库包括SQL server,MySQL和Oracle。(语法大致相同) 创建数据库指令:CRATE DATABASE websecurity; 查看数据库:show datebase; 切换数据库:USE websecurity; 删除数据库:DROP DATABASE websecurity;
|
26天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
32 1