mysql 主外键 策略_mysql外键策略

1.外键

建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作

create table dage( create table xiaodi(

dage_idint primary key, xiaodi_id int,

namechar(10) name char(10),

); dage_idint,

constraint fk foreign key(dage_id) references dage(dage_id));

建表后添加外键:alter table 表名 add constraint 外键名 foreign key(字段1) references 表名2(字段名) 级联操作

查看:①desc 表名; ②show create table 表名

删除:alter table 表名 drop foreign key 外键名

注意:设置了外键的表是从表,它关联的表被称为主表;给从表插入数据时,插入数据必须是主表的被关联字段出现的数据;先建主表再建从表;先删从表再删主表。

2.级联操作

on delete cascade:主表中的数据被删,从表中相关数据也会被删

on update cascade:主表中的数据被改后,从表中的相关数据也会被修改

on delete cascade on update cascade:删除和修改有级联操作

on delete set null:主表总数据被删除后,从表中相关数据为null

on update set null

3.示例

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

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

#tb_user中的一条记录1chy abcd

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

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

698988c59ec7fe9a84e7fc578787c30e.png

设计外键时,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(为了数据安全)。

http://www.cppblog.com/wolf/articles/69089.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值