zoukankan      html  css  js  c++  java
  • MySQL外键(表与表之间的关系)

    外键用来建立两张表之间的关系

    键语法:foreign key(当前表中建立观念西的外键字段)references 被关联表名(id)
    • 三种表与表之间的关系

      • 一对多

      • 多对多

      • 一对一

    • 研究表与表之间的关系

      • 如果将所有数据存放在一张表中的弊端:

        • 1.结构不清晰 ----> 不致命

        • 2.浪费空间 ---->不致命

        • 3.可扩展性极差---->不可忽视的弊端

          • 就类似将所有python代码存放在一个py文件中,强耦合在一起了---->解耦合 ---->拆分表

        • 拆分表解决以上的温蒂。

      • 这时候就需要我们上面提到的“外键”,给两张表建立一个强有力的关系。

    • 确认表与表之间的关系(一对多,多对多,一对一)

      • 注意:这时候必须要站在两个位置去思考,从两个表进行考虑来确立关系

        • 就以员工表的位置为例:多个员工能否对应一个部门? 答案显而易见:能!!!!!!!!

          员工与部门:多对一

           

        • 那么从部门表的位置思考呢:多个部门能否对应一个员工? 是不能吧。

          员工表单向多 对 一 部门表

          总结:凡是单向 多 对 一的表关系,称职位 一 对 多 的外键关系。

    不废话,直接上代码

    # 创建两张表
            1.必须先建立被关联表,再建立关联表
    
        # 被关联表:
            dep:
                create table dep(
                    id int primary key auto_increment,
                    dep_name varchar(16),
                    dep_desc varchar(255)
                );
    
        # 关联表:
            emp:
                create table emp(
                    id int primary key auto_increment,
                    name varchar(16),
                    age int,
                    gender enum('male', 'female', 'others') default 'male',
                    dep_id int not null,
                    foreign key(dep_id) references dep(id)
                );
                
                
         # 插入数据:
            - 1.必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。
            # dep:
                insert into dep(dep_name, dep_desc) values
                ('nb_外交部', '国际形象大使部门'),
                ('sb_教学部', '造程序员部门!!!!'),
                ('技术部', '技术有限部门');
    
            # emp:
                insert into emp(name, age, gender, dep_id)
                values('tank', 17, 'male', 1),
                ('jason', 70, 'male', 2),
                ('sean', 50, 'male', 2),
                ('egon', 88, 'male', 2),
                ('owen', 95, 'female', 3);
                
                
             # 报错,
                insert into emp(name, age, gender, dep_id) values
                ('大饼', 100, 'others', 999);
    
        # 更新数据或删除数据
            - 更新数据
            # 报错
            update emp set dep_id=100 where id=2;
            # 报错
            update dep set id=100 where id=1;
    
            # 先删除已关联的dep_id字段,才能修改dep表中的关联id字段。
            delete from emp where id=1;
            update dep set id=100 where id=1;
    
            # 删除: 先删除关联表中的记录,在删除被关联表中的记录
                - 删除emp表中的dep_id为2的记录
                delete from emp where dep_id=2;
    
                - 再删除dep表中id为2的记录
                delete from dep where id=2;   

    级联更新与级联删除

    	- on update cascade
            - on delete cascade
        - 创建表
            # 被关联表:
                dep2:
                    create table dep2(
                        id int primary key auto_increment,
                        dep_name varchar(16),
                        dep_desc varchar(255)
                    );
    
            # 关联表:
                emp2:
                    create table emp2(
                        id int primary key auto_increment,
                        name varchar(16),
                        age int,
                        gender enum('male', 'female', 'others') default 'male',
                        dep_id int not null,
                        foreign key(dep_id) references dep2(id)
                        on update cascade
                        on delete cascade
                    );
                    
             - 插入数据
            # dep:
                insert into dep2(dep_name, dep_desc) values
                ('nb_外交部', '国际形象大使部门'),
                ('sb_教学部', '造程序员部门!!!!'),
                ('技术部', '技术有限部门');
    
            # emp:
                insert into emp2(name, age, gender, dep_id)
                values('tank', 17, 'male', 1),
                ('jason', 70, 'male', 2),
                ('sean', 50, 'male', 2),
                ('egon', 88, 'male', 2),
                ('owen', 95, 'female', 3);
    
                # 报错,
                insert into emp(name, age, gender, dep_id) values
                ('大饼', 100, 'others', 999);
    
    
        - 更新数据或删除数据
            - 更新记录
                update dep2 set id=200 where id=1;
    
            - 删除记录
                delete from dep2 where id=200;

    注意: mysql中没有 多对一 只要 一对多

    多对多:

      也必须站在两张表的位置去思考;

     

     - 利用第三张表,为两张表建立“多对多外键关系”。
            - book:
                create table book(
                        id int primary key auto_increment,
                        title varchar(20),
                        price int,
                        book_content varchar(255)
                );
    
            - author:
                create table author(
                        id int primary key auto_increment,
                        name varchar(16),
                        age int
                );
    
    
            - book2author:
                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
                );
    
        - 插入数据
            - book
            insert into book(title, price, book_content) values
            ('金瓶mei', 199, '讲述朦胧时光的小故事'),
            ('python从入门到断气', 2000, '学习如何一夜秃头'),
            ('三体', 200, '跟着大佬进入宇宙奇幻世界')
            ;
    
            - author
            insert into author(name, age) values
            ('egon', 68),
            ('jason', 88);
    
            - book2author:
            insert into book2author(book_id, author_id) values
            (1, 1),
            (1, 2),
            (2, 2),
            (3, 1);
    
            # 报错, 插入的数据,book_id, author_id必须存在
            insert into book2author(book_id, author_id) values (4, 4);
    
            # 更新或删除
                # 更新
                    - update book set price=6666 where id=1;
                    - update book set id=4 where id=1;
    
                # 删除
                    - delete from book where id=4;
    

     

    一对一:

    两张之间的关系 一一对应,将一张数据量比较大的表,拆分成两张表

    	- user_info:
                  	id, name, age, gender, hobby, id_card
    
                - user:
                    id , name, age, detail_id(外键)
    
                - detail:
                    id, gender, hobby, id_card
    
                user与detail表建立了 一对一的外键 关系。
                foreign key 应该建在 使用频率较高的一方。
    
            - 创建表
                # 被关联表
                create table customer(
                    id int primary key auto_increment,
                    name varchar(16),
                    media varchar(32)
                );
    
    
                # 关联表
                create table student(
                    id int primary key auto_increment,
                    addr varchar(255),
                    phone char(11),
                    id_card char(18),
    
                    # 外键必须设置为唯一的
                    customer_id int unique,
                    foreign key(customer_id) references customer(id)
                    on update cascade
                    on delete cascade
                );
    
            - 插入数据
                insert into customer(name, media) values
                ('hcy', 'facebook'),
                ('zsb1', 'ig'),
                ('zsb2', 'vk'),
                ('hb', '探探');
    
    
                insert into student(addr, phone, id_card, customer_id) values
                ('上海', '15214546711', '440888888888888888', 1),
                ('北京', '18888888888', '440777777777777777', 2);
    
                # 报错,一对一,关系必须 一一对应
                insert into student(addr, phone, id_card, customer_id) values ('上海', '15214546711', '440888888888888888', 1);
    

      

      

      

     

     

  • 相关阅读:
    NCNN优化实时面部关键点检测
    使用 div 标签 contenteditable="true" 实现一个 聊天框,支持 Ctrl + v 粘贴图片
    《精益创业》读书总结
    DATAX使用
    canal增量同步原理以及使用说明
    element rules required 自定义表达式
    JavaScript 数组映射,重新整理
    wangeditor遮挡其他控件
    多个axios按顺序执行
    .NET Core 中基于 IHostedService 实现后台定时任务
  • 原文地址:https://www.cnblogs.com/lvguchujiu/p/12031223.html
Copyright © 2011-2022 走看看