在MySQL数据库中,我们在给某个表的某个字段设置外键约束的时候,需要设置,当主表进行删除(On Delete)和修改(On Update)时,从表作何反应。反应方式 有Restrict、Cascade、Set Null、和No Action四种,那么这四种各起什么作用呢?
在理解这几个反应方式之前,我们首先要确定什么是主表和从表。
例如我们有如下两个表:
customers表
字段名 | 字段类型 | 主键 | 外键 |
customer_id | INT | 是 | |
customer_name | CHAR(4) | | |
orders表
字段名 | 字段类型 | 主键 | 外键 |
order_id | INT | 是 | |
customer_id | INT | | customers表的customer_id |
product_id | INT | | |
price | FLOAT | | |
amount | TINYINT | | |
此时,orders表中的customer_id的取值取决于customers表,因此,我们把customers表称为主表,orders表称为从表。
对于添加在orders表的customer_id字段上的外键约束来说,对于删除和修改的操作有以下反应。
一、删除主表记录时(On Delete)
- Restrict(限制):不能删除主表记录。
- Cascade(联动):主表可以删除记录。并且当主表删除一个记录时,如果从表某记录的外键字段值等于主表被删除记录的主键字段值时,该一条或多条从表记录同时被删除。
- Set Null(设置为空):主表可以删除记录。并且当主表删除一个记录时,如果从表某记录的外键字段值等于主表被删除记录的主键字段值时,该一条或多条从表记录录并不会被删除,而只是外键字段被设置为NULL。前提是从表的外键约束字段允许为空。
- No Action(无动作):同Restrict
二、修改主表记录时(On Update)
- Restrict(限制):不能修改主表记录。
- Cascade(联动):主表可以修改记录。并且当主表修改一个记录的主键时,如果从表某记录的外键字段值等于主表被修改记录的主键字段值时,该一条或多条从表记录的外键字段同时被修改。
- Set Null(设置为空):主表可以修改记录。并且当主表修改一个记录的主键时,如果从表某记录的外键字段值等于主表被修改记录的主键字段值时,该一条或多条从表记录外键字段被设置为NULL。
- No Action(无动作):同Restrict
三、
No Action和Restrict的区别
- 在MySQL中,这两者相同。
- 有的数据库系统会延迟检查约束,No Action就是一种延时操作,而Restrict则立即执行。
- 由于MySQL中,不存在延迟检查外键约束,所以两者一样。