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约束。
原文地址:https://www.cnblogs.com/xlwu/p/13639829.html