3,外键之表关联关系,修改表,复制表

Posted fzhiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3,外键之表关联关系,修改表,复制表相关的知识,希望对你有一定的参考价值。

 今日内容:
  一:外键
   一对多:
   多对多:
   一对一:
  二:了解知识点
   复制表
   修改表相关操作
   
  前戏:
   所有的信息都在一张表中所带来的的问题
    1,表的结构不清晰
    2,浪费硬盘空间
    3,表的扩展性极差(是一个很难逃避的缺点)
   类似于我们把所有的代码都写在同一个py文件中
    在确定表与表之间的关系时,一定要换位思考(必须两方都考虑周全之后才能得出结论)
    以员工表和部门表为例:
     先站在员工表看能否有多个员工对应一个部门
      即:
       一个部门能否有多个员工
       可以!!!(暂时只能确定员工单向多对一 部门)
      
     在站在部门表看员工能否有多个部门对应一个员工
      即:
       一个员工能否在多个部门
       不可以!!!
    结论:员工表和部门表之间仅仅是单向的多对一
     那么他们之间的表关系就是“一对多”
     
      表关系中没有多对一一说,只有一对多
      (无论是多对一还是一对多都叫"一对多")
     
   2,如何让两种表有代码层面上真正的关联  就必须使用外键
    什么是外键?
     让表与表有硬性层面上的关系
    foreign key
     外键约束
      1.在创建表的时候 必须先创建被关联表
      2.插入数据的时候 也必须先插入被关联表的数据
     
     
     
  一:外键
   表与表之间的关系:
    要站在彼此不同的角度来考虑
   1,判断表关系的最简单的语法
    
    书籍与出版社的关系
    
     一本书的出版社可不可以有多个,   不可以!!!
     而一家出版社可不可以出版多本书,  可以!!!
     一对多的关系
    
    图书与作者表
     一本书可不可以有多个作者      可以!!!
     一个作者可不可以写多本书      可以!!!
     多对多的关系
     
    作者与作者详情
     一个作者可不可以有多个详情   不可以!!!
     一个作者详情可不可以有多个作者  不可以!!!
     要么两者之间是一对一
     要么两者之间没有任何关系
     
  ps:通常将关系字段 称之为 外键字段     ****************************
   一对多的外键字段  建在多的一方
   多对多   建在第三张表了
   一对一   外键字段建在任意一方都可以   但是推荐你建在查询频率较高的一方   
     
     
  
   
    一对多:
     建表:
     create table dep(
      id int primary key auto_increment,
      dep_name varchar(32),
      dep_desc varchar(64));
      
     create table emp(
      id int primary key auto_increment,
      emp_name varchar(64),
      emp_gender enum(‘male‘,‘female‘,‘others‘)default‘male‘,
      dep_id int not null,
      foreign key(dep_id)references dep(id)
      );
      
     插入数据:
      insert into dep(dep_name,dep_desc) values(‘技术‘,‘发动机‘);
     
      insert into emp(emp_name,emp_gender,dep_id) values(
       ‘张三‘,‘male‘,1),(‘李思‘,‘female‘,3),(‘网凉‘,‘female‘,2);
      
     修改数据:
      update emp set dep_id = 100 where id = 1;
      这样不能直接修改数据,修改不了
      
      ps:外键虽然能够帮你强制建立表关系 但是也会给表之间增加数据相关的约束
       
       1,删除数据的时候  先删员工表的数据 再删部门表的数据
        delete from emp where id = 4;
        delete from dep where id = 3;
      
       2,要想修改只能用级联更新,级联删除:
           级联更新:on update cascade  同步更新
           on delete cascade  同步删除
          
        建表:
        create table emp(
         id int primary key auto_increment,
         emp_name char(32),
         emp_gender enum(‘male‘,‘female‘,‘others‘) default‘male‘,
         dep_id int,
         foreign key(dep_id) references dep(id)
         on update cascade
         on delete cascade);
         
        insert into emp(emp_name,dep_id) values(‘张三‘,1),(‘赵四‘,3),(‘田七‘,2);

        技术图片

 


        
   多对多:
    
    图书与作者表
    一定要换位思考
     先站在图书
      多本书能否有一个作者
       一个作者能否写多本书 可以!!!
     
     再站在作者
      多个作者能否和写一本书  
       一本书能否有多个作者 可以!!!
       
     创建表:
      create table book(
       id int primary key auto_increment,
       book_name char(32),
       price int,
       author_id int,
       foregin key(author_id) references author(id)
       on update cascade
       on delete cascade
       );
       
      create table author(
       id int primary key auto_increment,
       name char(32),
       age int,
       book_id int,
       foregin key(book_id) references book(id)
       on update cascade
       on delete cascade
       );
       
      以上方法关联方法错误,多对多时不能用这种路基思维去关联表,
     注意:当两张表是多对多的关系时,就需要建立第三张表,用第三张表去分别关联另外两张表。
     必须手动创建第三张表 用来专门记录两种表之间的关系
      
      1,先建两张普通的表吗,不需要设置外键
       create table book(
        id int primary key auto_increment,
        title char(32),
        price int
        );
       
       create table author(
        id int primary key auto_increment,
        name char(32),
        age int
        );
        
       create table book2author(
        id int primary key auto_increment,
        book_id int,
        foreign key(book_id) references book(id)
        on update cascade
        on delete cascade,
        author_id int,
        foreign key(author_id) references author(id)
        on update cascade
        on delete cascade
        );
       
       
       insert into book(title,price) values(‘千禧金梅‘,10),(‘武则天‘,20),(‘西游记‘,30);
       
       insert into author(name,age) values(‘展宇‘,17),(‘大炮‘,16),(‘火箭‘,58);
       
       insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);
       
  一对一:
   外键字段建在任意一方都可以   但是推荐你建在查询频率较高的一方 
   # 左表的一条记录唯一对应右表的一条记录,反之也一样
   create table deta(
    id int primary key auto_increment,
    phon int,
    addr varchar(32)
    );
    
   create table author2(
    id int primary key auto_increment,
    name char(32),
    age int,
    deta_id int unique,    #该字段一定要是唯一的
    foreign key(deta_id) references deta(id)  #外键的字段一定要保证unique
    on update cascade
    on delete cascade
    );

  技术图片

 


   # 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系
   
 了解知识点:
  复制表:
   # mysql对大小写不敏感!!!
   语法:
   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 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
      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; 

以上是关于3,外键之表关联关系,修改表,复制表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL — 关联

外键关联的修改 级联 修改表行记录的操作

数据库之表关系

关系型数据库关联系统MySQL!

关系型数据库关联系统MySQL(增删改查)!

Mysql外键和表关系