在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中,不存在延迟检查外键约束,所以两者一样。