zoukankan      html  css  js  c++  java
  • 表关联关系,表的复制

    分表:
    到底是一对多还是多对1要看从那个角度出发
    分表后需要为表添加关联关系
    在老师表中的部门编号为1,但是1号部门根本不存在,所以该数据不是一条完整的数据
    需要通过外键约束,来保证数据只要插入就是完整的数据




    create table dept(id int primary key auto_increment,
    name char(10),
    job char(30));
    
    
    create table teacher(
    id int primary key auto_increment,
    name char(20),
    gender char(10),
    dept_id int,
    foreign key(dept_id)references dept(id)
    );
    
    insert into dept values(null,'教育部','教学生');
    
    insert into teacher values(null,'老杨','man',1)


    在老师表中的部门编号为1 但是1号部门根本不存在 所以该数据不是一条完整数据 需要通过外键约束 来保证数据只能插入 一定是完整的数据
    如果要将两张表用外键关联起来 一定要区分表的主从关系
    主表:部门表
    从表:老师表
    一定要先建主表 在创建从表

    添加外键约束的语法
    create table 表名称(
    一堆字段...,
    foreign key(要设置为外键的字段)references 主表名称(主表字段)
    )

    案例:
    #部门表
    id int primary key auto_increment,
    name char(10),
    job char(30));
    
    #老师表
    create table teacher(
    id int primary key auto_increment,
    name char(20),
    gender char(10),
    dept_id int,
    foreign key(dept_id)references dept(id));



    总结外键的作用:
    当我们把数据分到不同表之后 相互就没有任何联系了,
    如何才能保证数据完整,需要使用外键约束

    外键约束的原理:
    让从表的某个字段 参照主表的一个字段(通常是主键 主键是唯一不重复的)
    一旦外键关系建立之后,就会产生一系列的约束行为
    1.要先创建主表 在创建从表
    2.从表插入数据时 必须保证外键的值已经存在外键于主表中
    3.删除表时 要先删除从表 再删除主表
    4.当要删除主表中的记录时 要保证从表中没有记录
    5.主表更新时 如果要更新主键 必须保证从表中没有记录参照这一记录

    create table 名称(一堆字段,
    foreign key(外键字段) references 主表名(主键字段);

    从表中外键字段通常是int类型 通常外键都要参照对方的主键

    外键是一种约束 是为了保证数据完整性
    外键就是另一个表的主键
    外键用于建立物理层级的关联关系

    在正常开发中不推荐使用? 会降低存取效率
    所以一般会把关系的维护交给应用程序 就是逻辑层面的关系

    外键可以解决
    多对一的关联关系
    一个部门对应多个员工 1 V n
    多个员工对应一个部门 n V 1
    上述关系成立 那么一定是多对一
    在从表中增加一个字段用于关联主表的主键

    存在外键关系后 增删改 都收到了各种限制 操作起来较麻烦
    mysql提供了一个级联操作
    指的是 当主表发生改变 会同步操作从表
    级联更新 主表更新了主键时,从表会相应的更新外键的值
    级联删除 主表删除某一条记录 从表只要外键与被删除的记录主键值相同 则全部删除

    # 员工表   id name gender dept_id
    # 部门表  id  name
    
    create table dept(id int primary key auto_increment,name char(20));
    create table emp(id int primary key auto_increment,name char(20),gender char(10),dept_id int,foreign key(dept_id) references dept(id));
    
    
    设置级联的语法 在外键后面+on delete cascade和onupdate cascade 可以同时出现也可以单独使用
    create table emp(id int primary key auto_increment,name char(20),gender char(10),dept_id int,
    foreign key(dept_id) references dept(id) on delete cascade on update cascade
    );




    一对一关系的处理

    案例:
    客户表
    create table customer(id int primary key auto_increment,
    name char(20),
    phone char(20),
    addr char(50));
    
    insert into customer values(null,"渣渣辉","119","苏州");
    insert into customer values(null,"陈凯歌","120","北京");
    
    学员表
    create table student(id int primary key auto_increment,
    name char(20),
    class char(20),
    subject char(20),
    foreign key(id) references customer(id));
    
    insert into customer values(1,"渣渣辉","py6","python");
    insert into customer values(2,"陈凯歌","py6","python");

    一对一 关系 不需要增加字段 直接把从表的主键设置为外键即可
    通常一对一关系 是用来垂直分表的


    多对多的关系

    案例:
    学生表
    create table student(id int primary key auto_increment,
    name char(20),
    gender char(20));
    
    
    老师表
    create table teacher(id int primary key auto_increment,
    name char(20),
    gender char(20),
    subject char(29));
    
    
    关系表
     create table t_s_r(id int primary key auto_increment,
     s_id int not null,t_id int not null,
     foreign key(s_id) references student(id),
     foreign key(t_id) references teacher(id),
     unique(s_id,t_id)
     );
    
    
    #需要先添加数据到 两个主表 学生和老师
    insert into teacher values(1,"渣渣辉","man","python");
    insert into teacher values(2,"陈凯歌","man","python");
    
    insert into student values(1,"小明","man");
    insert into student values(2,"小红","woman");
    
    
    # 添加关系 数据
    渣渣辉 教过 小明
    insert into t_s_r values(null,1,1);

    多对多的处理:
    添加中间表 添加两个外键 分别关联不同的主表
    为了保证数据不重复 需要给两个外键添加 联合唯一约束
  • 相关阅读:
    js截取字符串区分汉字字母代码
    List 去处自定义重复对象方法
    63. Unique Paths II
    62. Unique Paths
    388. Longest Absolute File Path
    41. First Missing Positive
    140. Word Break II
    139. Word Break
    239. Sliding Window Maximum
    5. Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10538267.html
Copyright © 2011-2022 走看看