MySQL中的外键:
外键:
外键就是关系数据库的一个基本特征的实现,表明该字段的值是跟外部的某个表的字段的值“对应”的,或者也可以说来自于该外部的某个表的某个字段值,如果给一个设置外键的字段插入一个值,而该值并没有在该外键所指定的外部表中的对应字段中出现,则该值就会插入失败,也就是数据库内部的”约束机制”(使我们的数据更加纯净)
下面举个栗子来体会一下外键的作用:
比如说我们有一个班级表,当我们在学生表中录入学生信息时,需要录入学生所在班级的id,这个时候如果我们没有给这个学生表中的班级id设定外键约束,很有可能我们在录入学生信息的时候手一抖就把学生的班级id录错了,而如果在给学生表中的班级id设置外键约束,此时当我们录入学生表中的班级id如果在对应的班级表的id字段中没有的话就会出现错误提示,而不是将错误的数据添加到数据表中。
使用外键约束的好处:
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
下面通过一个栗子来演示一下上面那段连自己读起来都很绕的话:
创建班级表(tab_class):
create table tab_class(
id_class int auto_increment primary key/*班级id*/
,class_name varchar(20) unique key /*班级名称*/
,class_teacher varchar(20)/*班主任名字*/
, open_date TIMESTAMP/*开班时间*/
);
创建好的表结构:
插入模拟数据:
这里我们注意以下id_class的值 1-4
创建学生信息表(tab_student):
create table tab_student(
student_id int auto_increment primary key, /*学生id*/
stu_name varchar(20),/*学生姓名*/
age tinyint,/*学生年龄*/
stu_class_id int,/*学生所在的班级id*/
foreign key (stu_class_id) references tab_class(id_class)/*给学生所在的班级设置外键*/
);
设置外键的语法格式:
foreign key (字段名) references 表名(字段名)
tab_student的表结构:
下面我们来向tab_student表中插入一条数据:
insert into tab_student (stu_name,age,stu_class_id) values ('xiaohua',20,10);
由于给stu_class_id设置了外键约束而要插入的班级id 10并不在tab_class表中的id_class的字段的值的范围内,因此这条数据插入失败,提示一下错误信息:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`study_db`.`tab_student`, CONSTRAINT `tab_student_ibfk_1` FOREIGN KEY (`stu_class_id`) REFERENCES `tab_class` (`id_class`))
接下来我们再插入一条数据来验证最开始所说的栗子:
insert into tab_student (stu_name,age,stu_class_id) values ('huahua',20,1);
提示结果:
Query OK, 1 row affected (0.04 sec)
插入成功!
这里需要注意的是,当tab_class与tab_student之间的字段设置外键关联在之后,如果我们想要删除tab_class表中的一行数据,需要确保tab_student中设置的外键字段(stu_class_id)没有引用tab_class中的(id_class),否则会提示下面的错误:
Cannot delete or update a parent row: a foreign key constraint fails (`study_db`.`tab_student`, CONSTRAINT `tab_student_ibfk_1` FOREIGN KEY (`stu_class_id`) REFERENCES `tab_class` (`id_class`))
这种设计就保证了数据的一致性和完整性,假如你已经把id_class = 1对应班级表(tab_class)那条班级数据删除了,这时学生表(tab_student)就无法根据stu_class_id = 1去查询其所在的班级了。