• 十九、MySQL外键删除更新行为如何实现?


    1、行为约束

    (1)基础概念:        

    要学习外键约束,就要先了解外键约束。

            比如说,现在这里有两张表,其中一张存储着用户的信息(子表),另外一张存储着用户所属的部门(父表) ,但现在由于误操作,不小心将父表中某一条信息删除,那么就有可能导致子表中某些用户的部门信息变成无数据源,导致用户信息不完整。现在,又向子表中随意添加一组数据,改组数据可能没有对应的部门数据,这样的信息是不完整的!

            因而,这样就有必要设置外键约束。

    相对于基础建立外键的语句,只需要在其后加上"on update 行为"和"on delete 行为"即可

    alter table 子表名 add constraint 外键名称 foreign key (子表字段名) references 父表名(父表字段名) on update 行为 on delete 行为;

    (2)约束语法说明:

    当用户对父表进行修改时,设置不同的外键约束,子表会产生不同的变化。

    (3)no action和restrict:

    当父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有对应外键则不允许删除/更新。

    1. 当父表中删除/更新对应记录时,首先检查该记录是否有对应外键,
    2. 如果有对应外键则不允许删除/更新,
    3. 行为:no action 或 restrict

    (4)cascade:

     当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有,则删除/更新外键在子表中的记录:

    1. 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,
    2. 如果有,则删除/更新外键在子表中的记录:
    3. 行为:cascade

    (5)set null: 

    当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有,则设置子表中该外键值为null(注意,该处要求外键可取null)

    1. 当在父表中删除对应记录时,首先检查该记录是否有对应外键,
    2. 如果有,则设置子表中该外键值为null(注意,该处要求外键可取null)
    3. 行为:set null

    (6)set default:

     父表有变更时,子表将外键设置成一个默认的值,(注意,MySQL的默认数据存储引擎Innodb不支持)

    1. 父表有变更时,子表将外键设置成一个默认的值
    2. (注意,MySQL的默认数据存储引擎Innodb不支持)
    3. 行为:set default

    2、 操作:

    (1)语法:

    相对于基础建立外键的语句,只需要在其后加上"on update 行为"和"on delete 行为"即可

    alter table 子表名 add constraint 外键名称 foreign key (子表字段名) references 父表名(父表字段名) on update 行为 on delete 行为;

    (2)初始化表格:

    (3) 验证no action和restrict:

    在初始化表格之后,运行如下语句:

    1. alter table emp add constraint fk_number_emp
    2. foreign key (type) references number(id)
    3. on update no action on delete restrict ;

    进入父表,对某行数据执行删除操作:会报错!

    (4) 验证cascade:

    1. alter table emp add constraint fk_number_emp
    2. foreign key (type) references number(id)
    3. on update cascade on delete cascade ;

    在执行该语句之后,进入父表,删除第一行数据,再进入子表,可以看到外键在子表中的记录被删除:

    (5) 验证set null:

    1. alter table emp add constraint fk_number_emp
    2. foreign key (type) references number(id)
    3. on update set null on delete set null ;

    进入父表,删除第一行数据,再进入子表,可以看到外键在子表中的记录被设置为null:

  • 相关阅读:
    java -非空判断
    JAVAEE初阶相关内容第十一弹续集--多线程(进阶)之常见面试题汇总1
    如何批量一键下单寄快递
    vue使用CSS 变量
    ssh服务中如何批量管理100多台机器(Paramiko、 psutil模块)、跳板机(堡垒机)
    Flink—— Flink Data transformation(转换)
    工具推荐#简单图片转换为ASCII图(基于字符)
    如何实现前后端交互
    经典算法系列之(一):算法的基础概念,数据结构的基础概念,以及算法+数据结构=程序
    Java -- 每日一问:Java并发包提供了哪些并发工具类?
  • 原文地址:https://blog.csdn.net/2301_79149013/article/details/132766691