zoukankan      html  css  js  c++  java
  • 三十五、表与表之间的关系

    将所有数据都放在一张表内产生的弊端
     
    1.表的组织结构不清晰
    2.浪费存储空间
    3.可扩展性极差(修改某个部门信息 )    
    多对一:
    如何查找表与表之间的关系
        以站在员工表为例:
            多个员工能否属于一个部门    可以
    
        以站在部门表为例:
            多个部门能否有同一个员工    不可以
    
        只有站在两边分析,才能下结论:
            员工表单向多对一部门表
    外键(foreign key )
    1.必须先建被关联表
            create table dep(id int primary key auto_increment,
            dep_name char(16),
            dep_desc char(64));
    
        2.外键关联
            create table emp(id int primary key auto_increment,name char(6),
            gender enum('male','female','others') not null default 'male',  # default 空格直接书写
            dep_id int,
            foreign key(dep_id) references dep(id));
    
        3.插入数据
            (1):先增加数据的时候,要先增被关联表中的数据
                insert into dep(dep_name,dep_desc) values('外交部','形象代言人'),
                ('教学部','教书育人'),
                ('技术部','技术指导');
             (2):再增加
                insert into emp(name,gender,dep_id) values('jason','male',1),
                ('tank','male',2),
                ('engon','male',2),
                ('jerry','male',3);
    修改emp表中的dep_id字段
      
    update emp set dep_id=200 where id=1;   报错不能修改
        update dep set id=100 where id =1;  报错不能修改
        delete from dep where id=2;  报错不能删
    
    
        delete from emp where id>1 and id<4;
        delete from dep where id=2;
        这样就能修改了
    #给外键字段新增功能  同步更新同步删除(级联删除,级联更新)
      
    create table dep(id int primary key auto_increment,
            dep_name char(16),
            dep_desc char(64));
    
         create table emp(id int primary key auto_increment,name char(6),
            gender enum('male','female','others') not null default 'male',  # default 空格直接书写
            dep_id int,
            foreign key(dep_id) references dep(id)
            on update cascade  #同步更新
            on delete cascade);  #同步删除
    
    
         修改:
            update dep set id=100 where id =1;
            delete from dep where id=2;
            #删掉部门后,对应员工表就删除了;修改部门后,员工对应号也进行修改;修改员工,报错
    多对多:
    例如:作者与图书
        1.多个图书可能是一个作者写
        2.多个作者写同一本书(之前作者死了)
        这样就是 多对多 关系
        3.确定关系后,作者与图书,分别被第三者关联,然后再对应关系
    
        create table book(id int primary key auto_increment,
        title char(16),
        price int
        );
    
        create table author(id int primary key auto_increment,
        name char(16),
        gender char(16)
        );
    
        create table book2author(
        id int primary key auto_increment,
        book_id int,
        author_id int,
        foreign key(book_id) references book(id)
        on update cascade
        on delete cascade,
        foreign key(author_id) references author(id)
        on update cascade
        on delete cascade
        );
    
        insert into book(title,price) values
        ('武大郎与潘金莲','30.99'),
        ('围城','50.66'),
        ('python','21000');
    
        insert into author(name,gender) values
        ('json','male'),
        ('egon','female'),
        ('kevin','male');
    
        insert into book2author(book_id,author_id) values
        (1,1),
        (1,2),
        (1,3),
        (2,1),
        (2,3),
        (3,1),
        (3,2);
    一对一
        客户表和学生表(老男孩的客户与学生之间关系,报名之前都是客户,只有报了名的才能是学生)
        应用场景:比如:一张用户信息表分成两块,一块是用户名和密码,另一块是用户其他信息,这样在用户验证时候查找方便9速度快0
        #左表的一条记录唯一对应右表的一条记录,反之也是一样
    
        create table customer(
        id int primary key auto_increment,
        name char(20) not null,
        qq char(10) not null,
        phone char(16) not null
        );
    
        create table student(
        id int primary key auto_increment,
        class_name char(20) not null,
        customer_id int unique, #关联该字段一定要唯一
        foreign key(customer_id) references customer(id)  #外键的字段一定要保证unique
        on delete cascade
        on update cascade
        );
    # 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系
    总结:
    
    
    书籍和作者
    一本书可不可以被多个作者写 可以
    一个作则可不可以写多本书 可以
    多对多

    书籍和出版社
    一本书籍可不可以被多个出版社出版 不可以
    一个出版社可不可以出版多本书 可以
    一对多

    作者与作者详情表
    两个不可以就是一对一
    一对一

    了解知识点:
    1. 修改表名
                      alter table 表名
                                          rename 新表名;
                2. 增加字段
                      alter table 表名
                                          add 字段名  数据类型 [完整性约束条件…],
                                          add 字段名  数据类型 [完整性约束条件…];
                      alter table 表名
                                          add 字段名  数据类型 [完整性约束条件…]  first;  # 直接移到最前面
                      alter table 表名
                                          add 字段名  数据类型 [完整性约束条件…]  after 字段名;  # 寻找插哪个字段的后面
                3. 删除字段
                      alter table 表名
                                          drop 字段名;
                4. 修改字段  # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
                      alter table 表名
                                         modify  字段名 数据类型 [完整性约束条件…];
                      alter table 表名
                                         change 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    修改表的完整语句
    # 复制表结构+记录 (key不会复制: 主键、外键和索引)
        create table new_service select * from service;
        # 查询语句执行的结果也是一张表,可以看成虚拟表
    
        # 只复制表结构
        select * from service where 1=2;        //条件为假,查不到任何记录
    
        create table new1_service select * from service where 1=2;
    
        create table t4 like employees;
    复制表结构+记录
     
     
     
     
     
     
  • 相关阅读:
    发布TrajStat 1.4.4
    Dubbo原理解析-监控
    systemctl 命令完全指南
    Spring Boot 性能优化
    试用阿里云RDS的MySQL压缩存储引擎TokuDB
    编译安装 Centos 7 x64 + tengine.2.0.3 (实测+笔记)
    使用ssh公钥实现免密码登录
    Spring Boot Admin Reference Guide
    zookeeper集群搭建设置
    dubbo服务者配置说明
  • 原文地址:https://www.cnblogs.com/wukai66/p/11383286.html
Copyright © 2011-2022 走看看