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);

    多对多的处理:
    添加中间表 添加两个外键 分别关联不同的主表
    为了保证数据不重复 需要给两个外键添加 联合唯一约束
  • 相关阅读:
    DFS HDU 1518 Square
    输入初始单纯形表后的单纯形程序,线性规划 未写完
    奇数幻方 程序实现 C++,linux系统下的codeblocks写的,估计里面的清屏函数windows下不能被调用
    棋盘切割 DP POJ 1191
    POJ 3716 Cow Bowling 数字三角形 简单DP
    ZOJ 3703 Happy Programming Contest (01背包,稍微加点处理)
    SQL Server 2005 Analysis Services实践(二)
    SPGridView的使用增加自动生成的序列号
    SQL Server 2005 Analysis Services实践(一)
    [转帖]传说中的MOSS葵花宝典Office SharePoint Server 2007 Starter Guide
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10538267.html
Copyright © 2011-2022 走看看