zoukankan      html  css  js  c++  java
  • 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; 
  • 相关阅读:
    Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
    Appcan——Box
    基于SSH框架的网上商城的质量属性
    框架的选择
    软件体系结构的认识
    Cocos2d-x项目创建方式
    一、设计模式简介
    数组与字符串四(例子、使用(2))
    数组与字符串三(Cocos2d-x 3.x _Array容器)
    数组与字符串二(例子、使用)
  • 原文地址:https://www.cnblogs.com/Fzhiyuan/p/11385801.html
Copyright © 2011-2022 走看看