外键约束
维护一个学生与班级的关系
外键定义:外键就是指的是一个表的某个字段的值指向另外一个表的主键。
增加外键
在一张表中创建一个字段,该字段指向另外一张表的主键。通过一定的约束语句来指明其联系
1. 可以在通过创建表的时候,指定对应的外键
语法:foreign key(当前表中的外键字段)reference 外键指向的表(外键指向表的主键)
查看表结构
查看表创建语句
修改表的结构增加外键(指定外键名字)
Alter table 表名 add constraint 外键名foreign key(字段)references 父表(主键)
前提:字表中没有父表中不存在的值
外键的作用
父表:外键所指向的那张表称为父表
字表:外键所在的表
外键的作用主要是用来约束外键所在表的数据的操作以及外键所指向的表的操作
1. 一旦一张表有一个外键字段,那么该表外键字段值,就不能是外键所指向的表中的主键值之外的值
不能在表中增加一个在主键表里不存在的值这样的一条记录
2. 约束外键所指向的表的操作(父表不能更新和删除)
不能删除或者更新父表的行,因为改行被字表所引用
实际约束
外键对父表的约束只存在已经被指向的记录,其它没有被指向的记录可以随意被操作
修改外键:外键不能被修改,只能先删除后增加
删除外键
一张表中可能存在多个外键,所以在删除外键的时候,必须指定外键名称.
语法:alter table 表名 drop foreign key 外键名字
删除之会删除外键对应信息,索引不会被删掉
修改外键作用
修改外键的约束作用,修改外键对父表的操作约束。
默认的,对父表的约束操作是不允许删除和更新。
修改外键对父表的约束
置空:set null 当父表就行更新或者删除的时候,对应的子表里面的数据应该被设置成null
级联:cascade,当父表进行更新或者删除的时候,对应的子表里的数据应该被删除或者被更新
删除:父表删除有约束记录的还是子表怎么办?
将子表的外键值设置为null(保证子表的外键字段运行为空)
更新:父表更新有约束记录的时候子表怎么办?
将子表的外键值,级联更新
在增加外键的时候指定约束方式
On delect set null on update cascade : 当父表删除记录时,子表置空,当父表更新记录时子表跟着更新
要想实现置空功能,必须保证外键运行为空
外键的级联操作(更新)如果是删除,则子表对应的值变为null
外键的优缺点
优点:数据库管理者出发
1. 能保证数据一致性(父表修改之后,子表跟着修改)
2. 保证数据的安全性(不允许在子表中增加父表中不存在的值)
3. 将表与表之间的关系进行了关联(提现了关系型数据库)
从PHP开发者出发
1. 增加了维护的难度
实际开发中,一般不会使用外键字段,但是不使用外键约束。通过程序来实现表与表之间关系维护。
外键:更新班级Id,对应的学生的班级id也改变
不使用外键:更新班级ID,得到新的班级id和旧的班级id,通过旧的班级id去修改修改学生的班级id为新的。
外键作用简析
删除父表记录时一定要判断子表是否有指向该记录的数据,如果有的话要处理 |
外键 foreign key(C_id) references 班级表(C_Id) === 效果等价于连接线条
学生表 班级表
S_id | Name | Number | C_id |
1 | 张三 | 10 | 1 |
2 | 李四 | 12 | 2 |
3 | 王五 | 13 | 3 |
|
|
|
|
4 | 哈哈 | 15 | 4 |
C_id | Name | Room |
1 | PHP | 一班 |
2 | JAVA | 二班 |
3 | C语言 | 三班 |
因为外键的约束导致找不到对应的匹配,所以不允许