欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL 外键关联策略

程序员文章站 2022-04-15 16:10:47
eg.一个用户可有拥有多个订单,一个订单只能属于一个用户,一对多,在tb_order中使用外键user_id关联tb_user的id。 当删除、更新tb_user中的主键时,与之关联的tb_order要受到影响,比如 #tb_user中的一条记录 1 chy abcd #tb_order中一条记录, ......

 

eg.一个用户可有拥有多个订单,一个订单只能属于一个用户,一对多,在tb_order中使用外键user_id关联tb_user的id。

当删除、更新tb_user中的主键时,与之关联的tb_order要受到影响,比如

#tb_user中的一条记录
1  chy  abcd

#tb_order中一条记录,10是tb_order的id,1是所属user的id
10 ......  1

删除tb_user中id=1这条记录,或者更新id字段的值,mysql会如何处理tb_order中与之关联的记录?

 

 

MySQL  外键关联策略

 

 

设计外键时,mysql提供了4种外键关联策略

1、restrict   限制(默认策略)

要删除tb_user中的记录,或者更新主键字段的值,如果tb_order中有记录与之关联,则不能删除、更新(执行操作时会报错)

 

 

2、cascade   级联

删除tb_user中的记录时,会自动删除tb_order中与之关联的记录;

修改tb_user中id字段的值时,会自动修改tb_order中与之关联的记录的外键字段的值(同步变化)。

 

 

3、no action   什么也不做

删除tb_user中的记录,或者修改id字段的值,但tb_order中有记录与之关联,可以删除、更新,tb_order中与之关联的记录不作任何处理(数据不发生变化)。

此种策略需要存储引擎支持,如果存储引擎不支持,会自动换为restrict。

 

 

4、set null   置为null

删除tb_user的记录,或更新主键字段的值,会自动将tb_order中与之关联的记录的外键字段的值置为null。

这种方式有一个要求:设计tb_order时,外键user_id不能使用not null约束。

 

 

cascade用得最多,其次是restrict,未设置外键关联策略时默认为restrict(为了数据安全)。