zoukankan      html  css  js  c++  java
  • 多表关系 MySQL

    1. 多表关联

      为什么需要多个表?

               更好更精确的描述数据,但有时一个表里的字段太多,数据太大,查起来不方便,所以我们可以分表

      分表的原因?

        重复数据浪费空间 2.数据的结构混乱3.数据的扩展性,维护性差

      分表导致的问题?

               表1中可能存储了表2中不存在的数据,这样整个数据就不完整了,是一组无效的数据

      解决的方案?

               外键约束:为多个表之间建立联系

      语法:

            Create table t(字段名 类型),foreign key(要关联的字段名) refrences t1 (主键名)

    多表之间的关系:

             一对多,多对多,一对一

    一对多的情况:

    例子:一家公司的部门与员工

             Create table dept (id int primary key auto_increment,name char(20),job char(20));

      Create table emp (id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept (id));

    从这个例子我们可以知道两个之间是有主从关系的,所以我们在使用外键时,一定要注意主从关系

    外键的约束:

    1. 要先创建主表 再创建从表
    2. 插入记录时,要先插入主表,再插入从表
    3. 删除记录时,要先删除从表记录,在删除主表记录
    4. 从表更新外键时,必须保证外键的存在
    5. 更新主表id时,必须先删除从表关联的数据 或把关联的数据关联到主表的其他id上
    6. 删除主表时,要先删除从表

    由于外键的约束会导致:我们就删除主表的一条记录,就会出现问题

    解决方案:使用级联

    Create table dept (id int primary key auto_increment,name char(20),job char(20));

    Create table emp (id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept (id) on delete cascade on update cascade);

    on delete cascade 删除主表记录时,从表的相关记录同步删除

    on update cascade更新主表记录时,从表的相关记录同步更新

     注意是单向的  主表变化是 级联操作从表   从表的变化不会级联到主表

    多对多情况时:

    例子:老师和学生

    一个老师可以教多个学生

    一个学生可以被多个老师教

    这样用上面的方法就不对了,我们需要一个中间表 专门存储关联关系

    create table teacher(id int primary key auto_increment,name char(15));

    create table student(id int primary key auto_increment,name char(15));

    中间表

    create table tsr(id int primary key auto_increment,

    t_id int,s_id int,foreign key(t_id) references teacher(id),

    foreign key(s_id) references student(id));

    现在老师和学生 都是主表  关系表是从表

    相当于2个一对多

    插入数据和一对多一样,先插主表,再查从表

    先插入老师和学生数据

    一对一情况时: 和一对多一样

                使用场景: 当一个表这种字段太多 而常用字段不多时? 

    1. 可以采取垂直分表的方式来提高效率
    2. 可以采取水平分表  字段完全相同 即分成2个表(字段一样的表)

    比如:原有的person表 可以查成2个关联的表

    2.表的应用

                       1.修改表

      alter table 表名+

                        add   添加字段 after|first

                    after 添加字段到哪个字段后面

                    first 添加字段到最前面

                     modify 修改字段类型

                     change 修改字段名称  或 类型

                     drop  删除字段

                     rename 改表名

                 2.复制表

                     create table 新的表名 select * from 原表名;

                数据

                结构

            约束不能复制

            当条件不成立是 只复制表结构

            create table 新的表名 select * from 原表名 where 1 = 2;

            create table stu_copy2 select * from student1 where 1 = 2;

        3.蠕虫复制

          自我复制

          insert into 表名称 select *from 表名;

          如果有主键 避开主键字段

          insert into 表名称(其他字段) select 其他字段 from 表名;

        sql注入攻击

            一个了解sql语法的攻击者  可以在输入框输入sql语句

        132456789  123

        select *from user where account = ":"drop database mysql" and pwd = "123";

  • 相关阅读:
    聊聊自定义实现的SPI如何与spring进行整合
    聊聊读源码这件事
    聊聊自定义SPI如何使用自定义标签注入到spring容器中
    聊聊如何自定义数据脱敏
    聊聊自定义SPI如何与sentinel整合实现熔断限流
    排查not eligible for getting processed by all BeanPostProcessors
    SqlServer 数据脱敏脚本
    WPF 窗体使用 Show() 单个显示并设置弹窗相对于主窗体位置
    【SQLite】获取插入 ID 的几种方式
    Winform DataGridView 行单元格增加自定义 ToolTip
  • 原文地址:https://www.cnblogs.com/zhouhai007/p/9996444.html
Copyright © 2011-2022 走看看