您的位置:首页 > 数据库 > MySQL

MySQL中外键约束的反应方式

2017-05-20 10:53 423 查看
在MySQL数据库中,我们在给某个表的某个字段设置外键约束的时候,需要设置,当主表进行删除(On Delete)和修改(On Update)时,从表作何反应。反应方式 有Restrict、Cascade、Set Null、和No Action四种,那么这四种各起什么作用呢?

在理解这几个反应方式之前,我们首先要确定什么是主表和从表。

例如我们有如下两个表:

customers表

字段名字段类型主键外键
customer_idINT 
customer_nameCHAR(4)  
orders表

字段名字段类型主键外键
order_idINT 
customer_idINT customers表的customer_id
product_idINT  
priceFLOAT  
amountTINYINT  
此时,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中,不存在延迟检查外键约束,所以两者一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: