Mysql数据库–外键

外键: foreign key, 外面的键(键不在自己表中): 如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键.

增加外键

外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题).
一张表可以有多个外键.

创建表的时候增加外键: 在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

MySQL外键语句 mysql的外键_MySQL外键语句


在新增表之后增加外键: 修改表结构

Alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

MySQL外键语句 mysql的外键_主键_02

修改外键&删除外键

外键不可修改: 只能先删除后新增.

删除外键语法

Alter table 表名 drop foreign key 外键名; – 一张表中可以有多个外键,但是名字不能相同

MySQL外键语句 mysql的外键_外键_03

外键作用

外键默认的作用有两点: 一个对父表,一个对子表(外键字段所在的表)

对子表约束: 子表数据进行写操作(增和改)的时候, 如果对应的外键字段在父表找不到对应的匹配: 那么操作会失败.(约束子表数据操作)

MySQL外键语句 mysql的外键_MySQL外键语句_04


对父表约束: 父表数据进行写操作(删和改: 都必须涉及到主键本身), 如果对应的主键在子表中已经被数据所引用, 那么就不允许操作

MySQL外键语句 mysql的外键_主键_05

外键条件

1.外键要存在: 首先必须保证表的存储引擎是innodb(默认的存储引擎): 如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果.

2.外键字段的字段类型(列类型)必须与父表的主键类型完全一致.

3.一张表中的外键名字不能重复.

4.增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应.

MySQL外键语句 mysql的外键_主键_06

外键约束

所谓外键约束: 就是指外键的作用.
之前所讲的外键作用: 是默认的作用; 其实可以通过对外键的需求, 进行定制操作.

外键约束有三种约束模式: 都是针对父表的约束
District: 严格模式(默认的), 父表不能删除或者更新一个已经被子表数据引用的记录
Cascade: 级联模式: 父表的操作, 对应子表关联的数据也跟着被删除
Set null: 置空模式: 父表的操作之后,子表对应的数据(外键字段)被置空

通常的一个合理的做法(约束模式): 删除的时候子表置空, 更新的时候子表级联操作

指定模式的语法

Foreign key(外键字段) references 父表(主键字段) on delete set null on update cascade,

意思:在操作父表的时候,比如说删除,字表对应的外键会置空,如果父表更新,字表的外键也随父表更新。

MySQL外键语句 mysql的外键_字段_07


更新操作: 级联更新

MySQL外键语句 mysql的外键_字段_08


删除操作: 置空

MySQL外键语句 mysql的外键_字段_09


删除置空的前提条件: 外键字段允许为空(如果不满足条件,外键无法创建)

外键虽然很强大, 能够进行各种约束: 但是对于PHP来讲, 外键的约束降低了PHP对数据的可控性: 通常在实际开发中, 很少使用外键来处理.