zoukankan      html  css  js  c++  java
  • MySQL数据库 外键 foreign key

    1.多表关联

    表之间的关系
        一对多/多对多/一对一
    什么时候要分表?
        数据重复/结构混乱/扩展维护性差

    2.外键 约束

    create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名));

    多对一 举例:部门和员工,部门可有多个员工,员工只能在一个部门

    多对多 举例 一个老师可以教多个学生 一个学生可以被多个老师教,但需要一个中间表,专门储存关联关系

    create table teacher(id int primary key auto_increment,name char(15));
    create table student(id int primary key auto_increment,name char(15));
    #中间表
    create table tsr(
    id int primary key auto_increment,
    t_id int,s_id int,
    foreign key(t_id) references teacher(id),
    foreign key(s_id) references student(id)
    );

    一对一 举例:1.假设学生是由客户转化的,一客户只能产生一个学生,一个学生只能对应一个客户,这样的关系是一对一。使用外键来关联,但是需要给外键加上唯一约束. 2.当一个表字段太多,而常用的字段不多时,可采取垂直分表的方式来提高效率 也有另外一种提升效率的方式,水平分表,表中记录数据太多,效率会降低,可以采取水平分表,字段完全相同。

    create table customer(c_id int primary key auto_increment,
    name char(20),phonenum char(11),addr char(20));
    create table student1(s_id int primary key auto_increment,
    name char(20),
    class char(11),
    number char(20),
    housenum char(20),c_id int UNIQUE,
    foreign key(c_id) references customer(c_id)
    );

    使用外键时 必须分清主从关系
    **外键的第一种约**:束先建主表  再建从表
    **外键的第二个约束**:先插入主表  再插入从表
    **外键的第三个约束**:删除记录时  先删除从表记录  再删主表记录
    **外键的第四个约束**:从表更新外键时  必须保证外键是存在的
    **外键的第五个约束**:更新主表的id时  必须先删除从表关联的数据  或者把关联数据 关联其他的主表id
    **外键的第六个约束**:删除主表时 要先删除从表
    有了这几个约束后,主表和从表中的数据必然是完整的

    3.级联 cascade

    很多情况下,我们就是要删除主表,然而这样需要至少两条sql语句,操作麻烦,这时可以使用级联

    create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名)on delete cascade); 
    create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名)on update cascade); 
    on delete cascade 当主表删除记录时 从表相关联的记录同步删除
    on update cascade 当主表id更新时 从表相关联的记录同步更新

    注意这是单向的 主表变化时 级联操作从表 从表的变化不会级联到主表

  • 相关阅读:
    Kali Linux渗透基础知识整理(二)漏洞扫描
    Elasticsearch为记录添加时间戳timestamp
    手把手带你使用JS-SDK自定义微信分享效果
    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问
    Java 骚操作--生成二维码
    清除微信内置浏览器缓存
    使用python脚本Telnet 华为交换机备份配置
    如何备份思科、锐捷、Juniper的配置文件
    微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)
    How do you build a database?
  • 原文地址:https://www.cnblogs.com/unbrokenlin/p/9995412.html
Copyright © 2011-2022 走看看