zoukankan      html  css  js  c++  java
  • 31 外键约束

    31 外键约束
        
        * 关于外键约束的相关术语:
            外键约束:foreign key
            外键字段:添加有外键约束的字段。
            外键值 :外键字段中的每一个值。
     
        * 业务背景:
            
            请设计数据库表,用来维护学生和班级的信息?
                
                第一种方案:一张表存储所有数据
                t_calss 班级表
                no(pk)    name    classno        classname
                --------------------------------------
                1        zs1        101            呵呵
                2        zs2        101            呵呵
                3        zs3        102            呵呵
                4        zs4        102            呵呵
                5        zs5        102            呵呵
                
                缺点:冗余【不推荐】
                
                第二种方案:两张表(班级表和学生表)
                t_class(pk)        cname
                -----------------
                101            呵呵
                102            哈哈
                
                t_student 学生表
                sno(pk)    sname        cno(该字段添加外键约束fk)
                -------------------------------
                1            zs1            101
                2            zs2            101
                3            zs3            101
                4            zs4            102
                5            zs5            102
                
        * 将以上表的建表语句写出来:
        
            t_student当中的cno字段引用t_class表中的no字段,此时t_student表叫做子表。t_class表叫做父表。
            
            顺序要求:
                删除数据的时候,先删除子表,再删除父表。
                添加数据的时候,先添加父表,再添加子表。
                创建表的时候,先创建父表,在创建子表。
                删除表的时候,先删除子表,再删除父表。
            
            drop table if exists t_student;
            drop table if exists t_class;
            
            create table t_class(
                cno int,
                cname varchar(255),
                primary key(cno)
            );
            
            create table t_student(
                sno int,
                sname varchar(255),
                classno int,
                primary key(sno),
                foreign key(classno) references t_class(cno)
            );
            
            insert into t_class values(101,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
            insert into t_class values(102,'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
            
            
            insert into t_student values(1,'zs1',101);
            insert into t_student values(2,'zs2',101);
            insert into t_student values(3,'zs3',101);
            insert into t_student values(4,'zs4',102);
            insert into t_student values(5,'zs5',102);
            insert into t_student values(6,'zs6',102);
            
            
            select * from t_class;
            select * from t_student;
                
            
            //ERROR 1452 (23000): Cannot add or update a child row: a foreign key
            //constraint fails (`mydatabase`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
            insert into t_student values(7,'zs7',103);
            
        * 外键值可以为null?
            外键可以为null。
            
        * 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
            注意:被引用的字段不一定是主键,但至少具有unique约束。
  • 相关阅读:
    数据结构排序算法之堆排序
    整数划分
    二叉树的递归与非递归
    螺旋数组
    【图的DFS】图的DFS非递归算法
    Docker实战部署应用——Tomcat
    Docker实战部署应用——Redis
    Docker实战部署应用——MySQL5.7
    Docker其他操作:查看内部细节、IP、删除容器
    Docker数据目录相关操作
  • 原文地址:https://www.cnblogs.com/xlwu/p/13639829.html
Copyright © 2011-2022 走看看