一、外键约束
外键约束——将一个列添加外键约束与另一张表的主键(唯一列)进行关联之后,这个外键约束的列添加的数据必须要在关联的主键字段中存在
案例
创建原则:先创建不含外键的表也就是班级表
添加外键的方式
一般使用第一种,第二种主要用于修改已创建的表为副表,当约束再添加时,也应起名字。
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;