zoukankan      html  css  js  c++  java
  • MySQL之Foreign_Key

     

    MySQL之Foregin_Key

      一\一对多

    一.员工表和部门表
            dep  emp
            类似与我们将所有的代码都写在一个py文件内 
            确立标语表之间的关系 
            思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)

    思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)

    1.先站在部门表中看能否有多个部门对应一个员工

    1.先站在部门表中看能否有多个部门对应一个员工 
                翻译过来就是:一个员工能否有多个部门
                很显然不可以!!!
              在站在员工表中看能否有多个员工对应一个部门
                翻译过来:
                很显然是可以的!!!
              所以员工表和部门表之间仅仅打火机单向事务多对一
              他们的表关系就是"一对多"
              表关系中没有"多对一"的说法,都是"一对多"

      让两个表代码层面上的真正的关联,就是必须使用外键

    2,让两个表代码层面上的真正的关联,就是必须使用外键
               什么是外键呢>>> 让表与表之间有硬性关系
               foreign key 注意这里是没有下滑线的
               foreign key 
                    外键约束
                    1.在创建表的时候,必须先创建被关联系
                    2.插入数据的时候 也必须先插入被关联表的数据

      建表# 被关联

    create table dep(id int primary key auto_increment,
                    dep_name varchar(32),
                    dep_desc varchar(128));

      在建 关联表 注意加级联级删除(同事更新,更新的是直接关联的表)

    emp_name varchar(32),
                    emp_gender enum("male","female","other") default "male",
                    dep_id int,
                    foreign key(dep_id) references dep(id)
                    on update cascade 
                    on delete cascade);

    # 注意的是的外键是一个完整的语句 关联的是所在表的外键id 
      应用到真正关联的表.级联级更新级联删除


      插入数据 先插入被关联的表的具体数据 id 是自动自增所以不用添加

        insert into dep(dep_name,dep_desc_) values('教学部','教书育人'),
                    ('技术部','技术部门'),
                    ('外交部','形象大使');

      # 注意:表字段要写好细节

      # 插入具体值到关联表

    insert into emp(emp_name,emp_gender,dep_id) values(
                    'koko','male',1),
                    ('jason','male',2),
                    ('tank','female',3),
                    ('egon','male',3);l

      二\多对多

      多对多 思路:换为思考

                    如:书籍和作者
                    1.先站在书籍的角度看问题
                      多本书能否被一个作者写
                      # 翻译一个作者能否写多本书 很显然是可以的>>>一对多
                    2.再站在书籍的角度看问题
                      多个作者能否同写一本书 
                      一本书能否被多个作者写  很显然也是可以的>>>一对多
                      综合上述 多对多
                    
                    # 注意:多对多需要建立第三张关联书籍和作者的这两张表
                    确定好关系之后开始建表
                    所以建表的时候么有要求先建立那张表

    建表:

      书籍表

    create table book(id int primary key auto_increment,
                    title varchar(32),
                    price int);

      作者表

                    create table author(id int primary key auto_increment,
                    name varchar(32),
                    age int);

      #  多对多关系的建立 必须手动创建第三张关联表

    reate 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 author(name,age) values('koko',18),('mye',20),
                    ('tank',28);

      # 插入第三张表的关联数据

    insert  into book2author(book_id,author_id) 
                    values(1,2),(1,3),(2,1),(2,2),(3,2);
            

      三\一对一

      这个很简单的吧 就是把一个人的一张表拆分成两张表

      节省内存 和查询的效率问题
      一般foreign key 建在查询的比较多的一方

      比如一个人的信息表

      # 还是先建立被关联的表

    create table authordetail(id int primary key auto_increment,
                phone int ,
                addr varchar(255));

      # 注意:括号 完整性

      # 关联表 注意唯一性 unique

    create table author1(id int primary key auto_increment,
                name varchar(32),
                age int,
                authordetail_id int unique,
                foreign key(authordetail_id) references authordetail(id)
                on update cascade 
                on delete cascade);

      # 插入数据
      # 先插被关联表也就是详情表 

    insert into authordetail(phone,addr) values
    (131,'广西'),
    ('132','东莞'),
    (133,'山西');

      # 再插入主关联表

    insert into author1(name,age,authordetail_id) values
    ('koko',18,1),
    ('tank',20,2),
    ('jason',20,3);

      四\总结语法

    判断表关系的最简单的语法
            图书与出版社
                一本书可不可以有多个出版社  不可以!!!
                一个出版社可不可以出版多本书  可以!!!
                一对多的关系
            
            
            图书与作者表
                一本书可不可以有多个作者    可以!!!
                一个作者可不可以写多本书     可以!!!
                多对多的关系
            
            
            作者与作者详情
                一个作者可不可以有多个详情  不可以!!!
                一个作者详情可不可以有多个作者  不可以!!!
                 要么两者是一对一
                 要么两者之间没任何关系

      五\了解知识点:

      

    1.修改表的完整语句
                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;
                        

      七\作业

     练习:账号信息表,用户组,主机表,主机组

    #用户表
    create table user(
    id int not null unique auto_increment,
    username varchar(20) not null,
    password varchar(50) not null,
    primary key(username,password)
    );
    
    #用户组表
    create table usergroup(
    id int primary key auto_increment,
    groupname varchar(20) not null unique
    );
    
    #主机表
    create table host(
    id int primary key auto_increment,
    ip char(15) not null unique default '127.0.0.1'
    );
    
    #业务线表
    create table business(
    id int primary key auto_increment,
    business varchar(20) not null unique
    );
    
    #建关系:user与usergroup
    
    create table user2usergroup(
    id int not null unique auto_increment,
    user_id int not null,
    group_id int not null,
    primary key(user_id,group_id),
    foreign key(user_id) references user(id),
    foreign key(group_id) references usergroup(id)
    );
    
    #建关系:host与business
    create table host2business(
    id int not null unique auto_increment,
    host_id int not null,
    business_id int not null,
    primary key(host_id,business_id),
    foreign key(host_id) references host(id),
    foreign key(business_id) references business(id)
    );
    
    #建关系:user与host
    create table user2host(
    id int not null unique auto_increment,
    user_id int not null,
    host_id int not null,
    primary key(user_id,host_id),
    foreign key(user_id) references user(id),
    foreign key(host_id) references host(id)
    );

      练习:

    # 班级表
    cid    caption
    # 学生表
    sid sname gender class_id
    # 老师表
    tid    tname
    # 课程表
    cid    cname    teacher_id
    # 成绩表
    sid    student_id course_id number
  • 相关阅读:
    C#开发微信门户及应用(30)--消息的群发处理和预览功能
    C#开发微信门户及应用(30)--消息的群发处理和预览功能
    C#开发微信门户及应用(30)--消息的群发处理和预览功能
    ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事
    ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事
    ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事
    ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事
    原生JS设计轮播图
    C#从SQL server数据库中读取l图片和存入图片
    C#从SQL server数据库中读取l图片和存入图片
  • 原文地址:https://www.cnblogs.com/mofujin/p/11383617.html
Copyright © 2011-2022 走看看