• 外键


    一对多关系的处理:
    create table teacher(
    id int primary key auto_increment,
    name char(20),
    gender char(10),
    dept_id int);
    teacher表
    
    
    create table dept(
    id int primary key auto_increment,
    name char(10),
    job char(30));
    dept表
    问题:
    insert into teacher values(null,'xxx','name',1);
    在老师表中的部门编号为1 但是1号部门不存在 所以该数据 不是一条完整数据
    需要通过外键约束来保证数据只要能插入 一定是完整的数据
    强调:如果要将两张表用外键关联起来 一定要区分表的主从关系
    主表:部门表
    从表:老师表
    一定要先创建主表 在建从表
    语法:
    添加外键约束的语法
    create table 表名称(一堆字段。。。。
    foreign key(要设置为外键的字段) references 主表名称(主键字段));
    案例:
    部门表:
    create table dept(
    id int primary key auto_increment,
    name char(10),
    job char(30));
    部门表
        老师表:
    create table teacher(
    id int primary key auto_increment,
    name char(20),
    gender char(10),
    dept_id int,
    foreign key(dept_id) references dept(id));
    老师表
    总结外键的作用:
    当我们把数据分到不同表中之后,相互就没有任何联系
    如何才能保证数据完整,需要使用外键约束
    外键约束的原理:
    1.要先创建主表 再创建从表
    2.从表插入数据时 必须保证外键的值已经存在主表中
    3.删除表时 要先删除从表 再删除主表
    4.当要删除主表中的记录时 要保证从表中没有记录 参照这个记录
    5.主表更新时 如果要是更新主键 要保证从表没有记录参照着这一条记录
    语法:
    create table 名称(一堆字段,
    foreign key(外键字段) references 主表(主键字段))
    补充:
    从表中外键字段通常是int类型 通常外键都要参照对方的主键

    外键是一种 约束 是为了保证数据完整性
    外键用于建立物理层级关联关系
    在正常开发中不推荐使用 会降低存取效率
    所以一般会把关系的维护交给应用程序 就是逻辑层面的关系
    外键可以解决
    多对一的关联关系
    dept employe
    一个部门对应多个员工 1 v n
    多个员工对应一个部门 n v 1
    上述关系成立 那么一定是多对1
    在从表中增加一个字段用于关联主表的主键

    存在外键关系后 增删改都受到了限制 操作起来较麻烦
    mysql提供了一个级联关系
    指的是 当主表发生改变 会同时操作从表
    级联更新 主表更新了主键时 从表相应的更新外键的值
    级联删除 主表删除了某一条记录 从表只只要外键与被删除的记录主键相同 则全部删除

    员工表 id name gender dept_id
    部门表 id name
    create table dept(
    id int primary key auto_increment,
    name char(20));
    create table emp(
    id int primary key auto_increment,
    name char(20),
    gender char(20),
    dept_id int,
    foreign key(dept_id)reference dept(id));
    dept表
    设置级联的语法 在外键后面 + on delete cascade 和 on update cascade 可以捅死出现也可以单独使用
    create table emp (
    id int primary key auto-increment,
    name char(20)
    gender char(20),
    dept_id int,
    foreign key (dept_id)reference dept(id) on delete cascade on update cascade );
    emp表


    一对一关系的处理

    案例:
    客户表
    create table customer (id int primary key auto_increment,
    name char(20),
    phone char(20),
    address char(50));
    
    insert into customer values(null,'xxx','110','上海');
    insert into customer values(null,'yyy','120','北京');
    客户表
        学员表
    create table student(id int primary key auto_increment,
    name char(20),
    class char(20),
    subject char(20),
    foreign key(id)reference customer(id));
    
    insert into student values(1,'xxx','py','python');
    insert into student values(2,'yyy','py','python');
    学员表
    一对一 关系不需要增加字段 直接把从表得主键设置为外键即可
    通常一对一关系 是用来垂直分表的



    多对多的关系
    案例:
    学生表
    create table student(id int primary key auto_increment,
    name char(20),
    gender char(20));
    学生表
        老师表
    create table teacher(id int primary key auto_increment,
    name char(20),
    gender char(20),
    subject char(20));
    老师表
        关系表
    create table t_s_r(id int primary key auto_increment,
    s_id int not null,
    t_id int not null,
    foreign key(s_id)references student(id)
    foreign key(t_id)references teacher(id)
    unique (s_id,t_id));
    关系表
    需要先添加数据到 两个主表 学生和老师
    insert into student values(1,'xxx','man');
    insert into student values(2,'yyy','woman');
    
    insert into teacher values(1,'sss','man','python');
    insert into teacher values(2,'jjj','woman','linux');
    
    #添加关系 数据
    sss 教过 xxx
    insert into t_s_r values(null,1,1);
    添加数据
    多对多的处理:
    添加中间表 添加两个外键 分别关联不同的主表
    为了保证数据不重复 需要给两个外键添加 联合唯一约束
  • 相关阅读:
    前端性能优化--图片处理(Css Sprites 与 base64)
    CSS规范--春风十里不如写好CSS
    前端性能优化--图片懒加载(lazyload image)
    struts2不同版本在核心filter在web.xml中的配置
    Web.xml配置详解之context-param
    web.xml的加载过程是context-param >> listener >> fileter >> servlet
    web.xml中Listener的作用
    web.xml中Filter的作用
    字符串反转
    fastjson是什么东东?
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10538036.html
Copyright © 2020-2023  润新知