目录
约束和范式
除了主外键之外的其他列,不能出现在两张表上:这句话的意思是,在一个数据库中,如果存在两张表,那么除了主键和外键之外的其他列不能同时出现在这两张表中。
一、关于完整性约束
1.域完整性:限制数据类型,外键约束,默认值,非空约束。
2.实体完整性:唯一约束,逐渐约束,自增列
创建一张表,指定一个主键
CREATE TABLE temp (id int primary key);
用constraint声明主键
create table stu_info (id bigint, stu_name varchar(15), age tinyint, gender tinyint, telphone varchar(11), study_direction varcahr(20), CONSTRAINT pk_student_info primary key (id)) engine-innodb character set = utf8mb4; #pk_student_info 规范:pk_表名 或者: create table student_info ( id bigint, student_name varchar(20), age tinyint, gender tinyint, telphone varchar(11), study_direction varchar(20), PRIMARY KEY (student_name, telphone) ) engine=innodb character set = utf8mb4; #复合主键
用ALTER语句补充声明主键
create table student_info ( id bigint, student_name varchar(20), age tinyint, gender tinyint, telphone varchar(11), study_direction varchar(20) ) engine=innodb character set = utf8mb4; ALTER TABLE student_info add CONSTRAINT pk_student_info PRIMARY KEY (id); #CONSTRAINT - 约束
删除主键的方式:
ALTER TABLE stu_info DROP PRIMARY KEY;
三、外键约束
这张图可以大致的解释外键的作用:
1.防止脏数据
2.控制外表和主表同步数据
什么是外键:简单地说,就是“子表”中对应于“主表”的列,在子表中称为外键或者引用键
他的值要求与主表的主键或者唯一键相对应,外键用来强制引用完整性,例如在成绩表中,学号为外键,一个表可以有多个外键。
对比这三张表对我们数据库中的表创建外键
创建外键:
-
首先给stu_info和stu_grade两张表创建好主键
-
然后让stu_grade中的sid作为外键指向stu_info中的主键
此时在stu_grade这个外表中无法插入stu_info主表中不存在的 sid ,我们可以来做个实验:
给stu_grade这张表设置外键,外键的内容如图所示(其中删除时和更新时中的选项restrict表示限制,cascade表示级联操作),值得注意的是在设置外键的时候有这两个错误,
但是外键的效果还是设置成功了
设置好之后我们尝试在stu_grade表中添加stu_info没有的id数据就会报错
当我们在主表中删除外表已经引用了主表的内容的时候也会报错(是为了防止外表中的数据变成脏数据)
-
stu_grade中的cid作为外键指向course中的主键。
course的主键是cid,为int类型
所以用stu_info的cid(类型也必须为int)作为外键指向course的cid
然后测试就是和上面的测试一样了
设置唯一约束
唯一约束,同样也是保证数据行完整性的一种
唯一约束的目的:保证某一列数据的唯一性,例如:身份证,电话号码...如果重复添加,则抛出异常
create table student_info ( id bigint primary key auto_increment, student_name varcahr (20), age tinyint, gender tinyint, telphone varchar(11) unique, study_direction varchar (20)) engine=innodb character set = utf8mb4;
设置检查约束
检查约束:检查某一列的值,是否是自己规定的值,如果不是将抛出异常
比如性别...
create table student_info ( id bigint primary key auto_increment, student_name varchar(20) not null, age tinyint, gender set('男','女'), telphone varchar(11) unique, study_direction varchar(20)) engine=innodb character set = utf8mb4; 或者: create table student_info ( id bigint primary key auto_increment, studentname varchar (20) not nu11, age tinyint, gender enum('男','女'), telphone var char (11) unique, study_direction varchar(20)) engine=innodb character set = utf8mb4;
如果设置好了我们可以通过modify来修改检查约束
ALTER TABLE stu_info MODIFY sex('男','女');
默认值约束
设计三范式
1.第一范式:确保每一列保持原子性(意思就是每一列和每一列的关系都是独立的)
2.第二范式:确保每行的唯一性(差不多箱单故意主键主表和外键外表的关系)
3.第三范式:确保每一列都和主键列直接相关,而不是间接相关
为什么不能将所有内容放在同一张表里面?
例如:下面这张图,为什么不能将所有列放在这一张表里面
-
如果我们想临时添加一门新课,此时这门课没有学生参加,没有学生的成绩等等...此时,我们又该如何应对
-
如果我们要删除一门课程,怎么处理
-
如果要删除一个学生的成绩信息怎么办,难道将这门课直接删掉吗
作业:
1.根据蜗牛学院实际情况,设计一个学生管理系统的数据库
2.熟练以后,设计一个图书销售系统的数据库