zoukankan      html  css  js  c++  java
  • 关系与外键约束

     

     

    关系

    • 创建成绩表scores,结构如下

        id
        学生
        科目
        成绩

    • 思考:学生列应该存什么信息呢?
    • 答:学生列的数据不是在这里新建的,而应该从学生表引用过来,关系也是一条数据;根据范式要求应该存储学生的编号,而不是学生的姓名等其它信息
    • 同理,科目表也是关系列,引用科目表中的数据
    • 创建表的语句如下
    复制代码
    create table scores(
    id int primary key auto_increment,
    stuid int,
    subid int,
    score decimal(5,2)
    );
    复制代码
    复制代码
    一对一(假设独身子女)
    学生表:(id,学生名字,科目,成绩,motherid,fatherid)
    母亲表:(id,母亲名字)
    父亲表:(id,父亲名字)
    一对多
    学生表:(id,学生名字,科目,成绩,motherid,fatherid)
    母亲表:(id,母亲名字)
    父亲表:(id,父亲名字)
    
    多对多
    学生表:(id,学生名字,科目,成绩,motherid,fatherid,teacherid)
    老师表:(id,老师名字)
    复制代码

    外键

    • 思考:怎么保证关系列数据的有效性呢?任何整数都可以吗?
    • 答:必须是学生表中id列存在的数据,可以通过外键约束进行数据的有效性验证
    • 为stuid添加外键约束
    alter table scores add constraint stu_sco foreign key(stuid) references students(id);
    • 此时插入或者修改数据时,如果stuid的值在students表中不存在则会报错
    • 在创建表时可以直接创建约束
    复制代码
    create table scores(
    id int primary key auto_increment,
    stuid int,
    subid int,
    score decimal(5,2),
    foreign key(stuid) references students(id),
    foreign key(subid) references subjects(id)
    );
    复制代码

    外键的级联操作

    • 在删除students表的数据时,如果这个id值在scores中已经存在,则会抛异常
    • 推荐使用逻辑删除,还可以解决这个问题
    • 可以创建表时指定级联操作,也可以在创建表后再修改外键的级联操作
    • 语法
    alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;
    • 级联操作的类型包括:

        restrict(限制):默认值,抛异常
        cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除
        set null:将外键设置为空
        no action:什么都不做

  • 相关阅读:
    Code Chef December Challenge 2018题解
    UOJ#419. 【集训队作业2018】圆形(格林公式)
    BZOJ2178: 圆的面积并(格林公式)
    LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)
    LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)
    Code Chef MINPOLY(计算几何+dp)
    LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
    LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
    P5816 [CQOI2010]内部白点
    P5590 赛车游戏
  • 原文地址:https://www.cnblogs.com/wwthuanyu/p/10069728.html
Copyright © 2011-2022 走看看