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

简介: 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;

 


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
SQL 数据管理 关系型数据库
SQL 语言入门:开启数据管理的大门
在数字化时代,数据已成为核心资产,而 SQL 作为操作关系型数据库的标准语言,是数据从业者、程序员及办公人员必备技能。本文从基础概念讲起,详解 SQL 的核心用法,包括数据查询、插入、修改、删除及表结构操作,并通过实例演示帮助读者快速上手。掌握 SQL,不仅能提升数据处理效率,更为深入理解数据管理打下坚实基础。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
801 152
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
SQL Oracle 关系型数据库
SQL语言小结
针对数据库、表单和数据行的增删改,没有涉及到sql真正的用途也就是查询,sql提供的查询语句的关键字占 sql 语言的一半之多,查询语句还是得单拿出来讲,不然太多了。 因为没有涉及到查询,所以sql的新增和修改都是很笼统的做法,drop、alter drop、delete这些很容易,逻辑性也不强,再次说明sql的真正精髓在于查询,不然为啥叫做结构化查询语言
298 0
|
2月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
247 0
|
3月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
419 11
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
164 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。

热门文章

最新文章

推荐镜像

更多