MySQL——外键

概念

关键字:foreign key,也叫做外键约束!

如果一个实体A的某个字段,刚好指向另一个实体B的主键,那么实体A的这个字段就叫做外键;

所以,简单来说,外键就是本表的某个字段指向外表的主键!

上面的,学生表中的班级字段其实就是一个外键!

其中,被指向的实体集(班级表),叫做主实体集(主表),也叫做父实体集(父表),负责指向的实体集(学生表),叫做从实体集(从表),也叫做子实体集(子表)

作用

外键的意义就是用来约束关系内的实体!

为什么需要有外键约束,因为需要在插入记录的时候,保证其符合现实中的正常的逻辑关系:

假如上面的有一个学生的班级字段里面出现了11班,就不符号逻辑,因为班级表中根本就没有11班!

所以,外键的约束主要体现在以下的两个方面:

1,  增加子表记录的时候,需要判断是否有与之对应的父表记录!

2,  当删除或更改父表记录的时候,子表应该如何处理相关的记录!

定义

应该在从表的某个字段上增加一个外键属性用于执行主表的主键!

 1 -- 定义父表
 2 create table web_class(
 3     class_id int unsigned primary key auto_increment,
 4     class_teacher varchar(20) not null
 5 );
 6
 7 -- 定义子表
 8 create table web_student(
 9     stu_id int unsigned primary key auto_increment,
10     stu_name varchar(20) not null,
11     stu_home varchar(100),
12     stu_class_id int unsigned,
13     -- 定义外键
14     foreign key(stu_class_id) references web_class(class_id)
15 );

设置级联操作

级联操作(关联动作):操作一张表,影响另一张表
1.主表更新
语法形式: on update[级联操作]
2.主表删除
语法形式: on delete[级联操作]

上面的级联操作常见的都有三种形式:
cascade: 同步操作,串联操作,也就是当主表的字段更新或者删除的时候
从表的外键也进行删除或者更新

set null: 设置为空,也就是当主表的字段更新或者更新或者删除的时候,从表的外键字段就设置为null
当然,前提是从表的外键字段没有非空约束

restrict: 就是拒绝主表更新或者删除

所以,常见的级联操作一共有9种,

-- on update cascade on delete cascade
-- on update cascade on delete set null
-- on update cascade on delete restrict

-- on update set null on delete cascade
-- on update set null on delete set null
-- on update set null on delete restrict

--on update restrict on delete cascade
--on update restrict on delete set null
--on update restrict on delete restrict

所以完整的定义外键方式语法:

1 -- foreign key(从表的外键字段) references 主表名(主表的主键)
2 on update cascade|set null|restrict on delete cascade|set null|restrict

删除外键:
语法:

1 /*
2 删除外键
3 alter table 表名 drop foreign key 外键名;
4 这里的外键名不是外键的字段名,而是系统在定义外键的时候自动分配的一个名字
5 可以通过show create table 表名\G;查看;
6 */
7 alter table web_student drop foreign key `web_student_ibfk_1`;

-- 增加外键

/*
alter table 表名 add foreign key(从表的外键字段) reference 主表名(主表的住主键) 级联操作;

alter table 表名 add foreign key(从表的外键字段) references 主表名(主表的主键)
on update cascade|set null|restrict on delete cascade|set null|restrict
*/
alter table web_student add foreign key(stu_class_id) references web_calss(class_id)
on update cascade on delete set null;

测试

1 -- 先在主表上更新
2 update web_class set class_id = 8 where class_id = 7;
1 --查询子表
2 select * from web_student;
1 -- 先在主表上删除
2 delete web_class where class_id = 8;
1 --查询子表
2 select * from web_student;

测试其他的级联操作

注意:
1.在某些大型的项目中,可能只会用到外键的设计思想,但是往往不会真正的从语法上
进行外键操作,因为外键的级联操作可能会见底mysql执行速度!而往往使用
两条sql语句去替代外键的级联操作(分别操作的sql语句)

2.外键的约束,只有在InnoDB存储引擎上存储才能执行

时间: 2024-07-30 20:32:14

MySQL——外键的相关文章

MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL

MySQL外键设置中的的属性含义: cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 Restrict方式 同no action, 都是立即检查外键约束 Set default方式 父表有变更

4Python全栈之路系列之MYSQL外键

Python全栈之路系列之MySQL外键 先来个例子来说明什么是外键以及外键的作用,so,XO公司现正处于一种迅速发展的状态,从最初的12人的团队发展到现在的300人,那么问题就来了,发展的越快,人员与部门就越来越多,这是老大要求我们做一个人员管理系统,用于查询入职人员的信息等. 起初我们想用一个表来实现所有的人员统计,创建Personnel库,用于存放公司员工的信息,指令如下: CREATE DATABASE personnel DEFAULT CHARSET utf8 COLLATE utf

mysql外键使用和事物使用

mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存有 每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制:

【转】MySQL外键约束On Delete、On Update各取值的含义

转载地址:http://hi.baidu.com/jxqlovejava/item/3d2cc5b5d689917c244b0920 ? 先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性. 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除. 当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录

MySQL外键使用及说明(简单易懂)

MySQL外键使用及说明 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立:  3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好

Mysql 外键设置

MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.    例如:    有一个基础数据表,用来记录商品的所有信息.其他表都保存商品ID.查询时需要连表来查询商品的名称

mysql外键约束总结

总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松.这里以MySQL为例,总结一下3种外键约束方式的区别和联系. 这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组. 首先创建用户组表: 创建用户组表 create table t_group ( id int not n

MySQL外键的作用

MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( `stu_id` int(11) NOT NULL DEFAULT '0', `course_id` int(11) NOT NULL DEFAULT '0', `grade` float DEFAULT NULL, PRIMARY KEY (`stu_id`,`course_id`) ); CREA

MySQL外键+唯一索引

MySQL外键+唯一索引 2019-08-22 1.外键 是指一个表里的列与另一张表里的列进行关系连接,可用于使用简单的数字或字母替代复杂的数据结构,不仅可以节省空间,也拥有约束功能,可减少书写出错的机会. 1.1使用方式 constraint 变量名 foreign key (列名) references 表名2(列名2): 其中变量名是自己给定的,约定不可以有重复: 列名即需要连接外键的列: 表名2值指的是外键的表: 列名2是和表中连接对应的列: 1.2实例 例如下面两个表,表1是机器状态表

mysql外键(FOREIGNKEY)介绍及使用注意事项

一.基本概念 1.MySQL中"键"和"索引"的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引.用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引. 2.外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接. 3.如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果