表的三范式和约束

一、表的三范式

1NF、要保证每个字段具有原子性不可再拆分、没有重复字段
2NF、表中要有主键且所有字段不能与主键部分依赖,如果不满足可以通过拆表来满足
3NF、确保每个字段都与主键直接相关,而不是间接相关,如果是可以通过消除冗余项或者拆表来满足
在使用关系型数据库的过程中总结的三项建立表的准则,如果遵守它能够最大效率地使用数据库

-- 学生表
    -- 学号 姓名 性别 身份证号 班级编号
    create table student(
        id int primary key,
        name varchar(30) not null,
        sex char default 'w',
        id_card char(18) unique,
        class_id int,
        foreign key(class_id) references class(id)
    );

-- 成绩表
    -- 学号 总分 语文 数学 英语
    create table grade(
        id int primary key,
        total double check (total>=0 && total <=300),
        c_grade double check (c_grade>=0 && c_grade <=100),
        m_grade double check (m_grade>=0 && m_grade <=100),
        e_grade double check (e_grade>=0 && e_grade <=100)
    );

-- 班级表
    -- 班级编号 教室 班主任 语文老师 数学老师 英语老师
    create table class(
        id int primary key,
        room_id int not null,
        class_tch int,
        c_tch int,
        m_tch int,
        e_tch int,
        foreign key(class_tch) references teacher(id),
        foreign key(c_tch) references teacher(id),
        foreign key(m_tch) references teacher(id),
        foreign key(e_tch) references teacher(id),
    );

-- 教师表
    -- 工号 姓名 性别 身份证号 科目 职称
    create table teacher(
        id int primary key,
        name varchar(30) not null,
        sex char default 'w',
        id_card char(18) unique,
        subject char(20),
        title char(20)
    );

二、表的约束

约束是对表和表中数据的限制,可以提高表中数据的准确性和可靠性,一般在创建表、修改表时使用

1、约束的分类
约束类型名称作用
not null非空约束字段的数据不能为空,例如学生姓名
default默认值约束给字段设置默认值后,当插入数据不提供该字段的数据时,数据库会自动填充为默认值,例如学生性别
unique唯一约束该字段数据不能重复,但是可以为null,例如身份证号
primary key主键约束非空且唯一,只有一个,例如学号
check检查约束设置一个条件,当插入数据不满足该条件时会失败,但是MySQL不支持\Oracle支持
foreign key外键约束用表A中的数据来确保表B中数据的准确性,例如表B中的某个字段值必须在表A中的某个字段的值中出现过,否则无法插入,例如教师表中的教师号必须在教师表中出现过
2、约束的设置方式

①创建表时设置约束

create table 表名(
	字段名 类型 约束名,
	...
);

②修改表时设置约束:只有not null\default 有效,可以增加、删除约束

alter table 表名 modify 原字段名 类型名 约束;
--  增加约束
alter table 表名 modify 原字段名 类型名;
--  删除约束

③删除约束:只有unique\primary key有效

alter table 表名 drop constraint 约束名;
3、外键约束

一张表(子表)的值必须引用自另一张表(父表),并且被引用的父表的字段必须具备唯一性,子表中被外键约束的字段值必须来自父表或者为null
一般在创建表的外键约束时,需要先创建父表,再创建子表

create table 父表(
	字段a 类型 primary key/unique;
);
create table 子表(
	字段b 类型;
	...
	foreign key(字段b) references 父表(字段a);
);

也可以在后期添加外键,不建议,可能非法值已经存在

alter table 子表 add foreign key(子表字段) references 父表(父表字段);

注意:应该先插入父表数据,再插入子表数据

/*父表更新、删除数据:
        1、先修改\删除子表,再删除父表
        2、设置级联删除、级联更新
            on delete cascade 级联删除
                父表数据删除,子表对应数据也随之删除
            on update cascade 级联更新
                父表数据更新,子表对应数据也随之更新*/
        
        create table 子表(
            ...
            foreign key(字段b) references 父表(字段a) on delete/update cascade;
        );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值