• MySQL——外键


    概念

    关键字:foreign key,也叫做外键约束!

    如果一个实体A的某个字段,刚好指向另一个实体B的主键,那么实体A的这个字段就叫做外键;

    所以,简单来说,外键就是本表的某个字段指向外表的主键!

    上面的,学生表中的班级字段其实就是一个外键!

     其中,被指向的实体集(班级表),叫做主实体集(主表),也叫做父实体集(父表),负责指向的实体集(学生表),叫做从实体集(从表),也叫做子实体集(子表)

    作用

    外键的意义就是用来约束关系内的实体!

    为什么需要有外键约束,因为需要在插入记录的时候,保证其符合现实中的正常的逻辑关系:

     假如上面的有一个学生的班级字段里面出现了11班,就不符号逻辑,因为班级表中根本就没有11班!

    所以,外键的约束主要体现在以下的两个方面:

    1,  增加子表记录的时候,需要判断是否有与之对应的父表记录!

    2,  当删除或更改父表记录的时候,子表应该如何处理相关的记录!

    定义

    应该在从表的某个字段上增加一个外键属性用于执行主表的主键!

     1 -- 定义父表
     2 create table web_class(
     3     class_id int unsigned primary key auto_increment,
     4     class_teacher varchar(20) not null
     5 );
     6 
     7 -- 定义子表
     8 create table web_student(
     9     stu_id int unsigned primary key auto_increment,
    10     stu_name varchar(20) not null,
    11     stu_home varchar(100),
    12     stu_class_id int unsigned,
    13     -- 定义外键
    14     foreign key(stu_class_id) references web_class(class_id)
    15 );


    设置级联操作

    级联操作(关联动作):操作一张表,影响另一张表
    1.主表更新
    语法形式: on update[级联操作]
    2.主表删除
    语法形式: on delete[级联操作]

    上面的级联操作常见的都有三种形式:
    cascade: 同步操作,串联操作,也就是当主表的字段更新或者删除的时候
    从表的外键也进行删除或者更新

    set null: 设置为空,也就是当主表的字段更新或者更新或者删除的时候,从表的外键字段就设置为null
    当然,前提是从表的外键字段没有非空约束

    restrict: 就是拒绝主表更新或者删除

    所以,常见的级联操作一共有9种,

    -- on update cascade on delete cascade
    -- on update cascade on delete set null
    -- on update cascade on delete restrict
    
    -- on update set null on delete cascade
    -- on update set null on delete set null
    -- on update set null on delete restrict
    
    --on update restrict on delete cascade
    --on update restrict on delete set null
    --on update restrict on delete restrict


    所以完整的定义外键方式语法:

    1 -- foreign key(从表的外键字段) references 主表名(主表的主键)
    2 on update cascade|set null|restrict on delete cascade|set null|restrict

    删除外键:
    语法:

    1 /*
    2 删除外键
    3 alter table 表名 drop foreign key 外键名;
    4 这里的外键名不是外键的字段名,而是系统在定义外键的时候自动分配的一个名字
    5 可以通过show create table 表名G;查看;
    6 */
    7 alter table web_student drop foreign key `web_student_ibfk_1`;

    -- 增加外键

    /*
    alter table 表名 add foreign key(从表的外键字段) reference 主表名(主表的住主键) 级联操作;
    
    alter table 表名 add foreign key(从表的外键字段) references 主表名(主表的主键)
    on update cascade|set null|restrict on delete cascade|set null|restrict
    */
    alter table web_student add foreign key(stu_class_id) references web_calss(class_id)
    on update cascade on delete set null;


    测试

    1 -- 先在主表上更新
    2 update web_class set class_id = 8 where class_id = 7;
    1 --查询子表
    2 select * from web_student;
    1 -- 先在主表上删除
    2 delete web_class where class_id = 8;
    1 --查询子表
    2 select * from web_student;

    测试其他的级联操作

    注意:
    1.在某些大型的项目中,可能只会用到外键的设计思想,但是往往不会真正的从语法上
    进行外键操作,因为外键的级联操作可能会见底mysql执行速度!而往往使用
    两条sql语句去替代外键的级联操作(分别操作的sql语句)

    2.外键的约束,只有在InnoDB存储引擎上存储才能执行

  • 相关阅读:
    Work harder, smarter 工作需要努力和智慧
    且慢下手(转)
    .net 打包中的参数传递
    sql语句编写技巧
    在安装文件中解压sfx压缩文件
    vs.net编程技巧
    統制勘定(reconciliationaccounts)とは
    ExtJs页面布局总结(转载)
    ext自定义form表单参数为JSON格式getJsonValue:(同时提交多个表单时需要用到)
    oracle截取日期函数
  • 原文地址:https://www.cnblogs.com/mrszhou/p/7461055.html
Copyright © 2020-2023  润新知