三十五、表与表之间的关系

将所有数据都放在一张表内产生的弊端
 
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;
复制表结构+记录

 

 
 
 
 
 
 
posted @ 2019-08-20 15:40  凯帅  阅读(251)  评论(0编辑  收藏  举报