关于外键约束

外键约束

外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。

外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。举个例子:如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_clazz(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_clazz字段是学生表的外键。通过stu_clazz字段就建立了学生表和班级表的关系。

 

【示例5】表的外键约束

-- 创建一个班级表  

create table class (  

    cno int(4) auto_increment,  -- 只有主键才可以自增  

    cname varchar(12) not null,  

    room  varchar(4),   

    primary key(cno)  

);  

-- insert into class values (null,'Java001',507);  

-- insert into class values (null,'Java002',502);  

-- insert into class values (null,'大数据001',401);  

insert into class values (null,'Java001',507),(null,'Java002',502),(null,'大数据001',401);  

-- 查询数据  

select * from class  

-- 创建一个学生表  

create table student2(  

    sno int(6) primary key auto_increment,  

    name varchar(12),  

    sex char(1),  

    age int(2),  

    classno int(4),  

    constraint fk_stu2_classno foreign key (classno) references class(cno)  

);  

desc student2;  

insert into student2 values(null,'zhangsan','',23,1);  

insert into student2 values(null,'lisi','',24,1);  

insert into student2 values(null,'wangwu','',16,2);  

insert into student2 values(null,'zhaoliu','',24,4);  --   

delete from class where cno = 1  

update class set cno = 5 where cno = 2  

select * from class  

select * from student2  

-- 如果想删除1班,请手动的先对1班的学生进行处理(删除或者清空外键)  

update student2 set classno = null where classno = 1  

delete from class where cno = 1  

-- 希望在更新班级编号的时候,可以直接更新学生的班级编号;希望在删除某个班级的时候,清空学生的班级编号  

-- 修改外键设置:外键要修改只能先删除再添加  

alter table student2 drop foreign key fk_stu2_classno; -- 注意提示的问题,其实已经删除了外键  

alter table student2 add constraint fk_stu2_classno foreign key (classno) references class(cno) on delete set null on update cascade  

原文地址:https://www.cnblogs.com/vincentmax/p/14251552.html