MySQL中的外键

MySQL中的外键:

外键:

外键就是关系数据库的一个基本特征的实现,表明该字段的值是跟外部的某个表的字段的值“对应”的,或者也可以说来自于该外部的某个表的某个字段值,如果给一个设置外键的字段插入一个值,而该值并没有在该外键所指定的外部表中的对应字段中出现,则该值就会插入失败,也就是数据库内部的”约束机制”(使我们的数据更加纯净)

下面举个栗子来体会一下外键的作用:

比如说我们有一个班级表,当我们在学生表中录入学生信息时,需要录入学生所在班级的id,这个时候如果我们没有给这个学生表中的班级id设定外键约束,很有可能我们在录入学生信息的时候手一抖就把学生的班级id录错了,而如果在给学生表中的班级id设置外键约束,此时当我们录入学生表中的班级id如果在对应的班级表的id字段中没有的话就会出现错误提示,而不是将错误的数据添加到数据表中。

使用外键约束的好处:

  1. FOREIGN KEY 约束用于预防破坏表之间连接的行为。

  2. 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去查询其所在的班级了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值