MySQL入门笔记表关系(VirtualBox第二天)
回顾一下,第一天我们了Mysql数据库的基本概念,以及对数据库的创建删除,表的创建删除,以及表中字段,数据的增删改查。
今天我们的学习学习目录如下:
一,表约束
二,表结构
三,数据库三范式
一,表约束
1,非空约束 (NOT NULL)
通俗的讲当你填学生信息表时你的名字以及学号必须填写时,就被称为非空约束(必须填的信息)。(YES NULL 表示可以为空)
当我们查看表格信息时可以看见通过基本操作我们没有对表进行约束,全部字段都可以为空。
alter table stu change name name varchar(20) not null;
对表stu 进行修改(change)修改name字段(因为我们对表进行约束所以不改变字段名和字段类型还是 name varchar(20) )为非空字段(not null)。修改后我们可以从图中发现name字段的NULL约束变成了NO,也就非空字段
我们不妨试一试不给name进行传值会发生什么,结过如下可以看见系统进行了报错name没有定义(也就是不能为为空)。
2,唯一约束(unique key)
顾名思义唯一约束是指某个字段不能有重复的内容是这个字段中唯一存在的。(例如学号每个人的学号都是不一样的)。
alter table change stu_number stu_number int unique key;
(将stu表中的stu_number字段修改为唯一约束)
如图可以看见在key这一列stu_number多了一个UNI(表示唯一)。
我们不妨试一下当我们输入相同的学号时会发生什么?如下图可以看见系统提示我们2019441111学号已经存在且唯一。
3,主键约束(primary key)
主键约束可以理解为非空且唯一约束(例如我们的学号是不能为空且唯一的),每张数据表只能存在一个主键。
alter table stu change stu_number stu_number int primary key;
(将表中stu_number字段修改为主键约束),结果如下可以看见在key这一列stu_number的约束变成了PRI(主键约束)。
4,自增约束(auto_increment)
自动编号,且必须与主键一起使用,默认情况下,起始站为1,每次的增量为1。
例如当学校对学生进行学号编写时就可以使用自增约束,每录取一个人学号就自动增加1。
可以看见我们没有去输入学号,利用自增约束就可以接着最后一个每次加1进行自动增长。
5,默认约束(default)
初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值。例如我们在填写学校名称时大家都是一个学校的就可以使用默认约束。
alter table stu add campus varchar(10) default ‘ck’
(设置默认约束名称为’ck‘重科)
结果如下可以看见学生的学校默认为ck。
学了这么多约束我们来新建立一个表格名称为 stu_test 要求如下
id int primary key auto_increment
学生编码整型,是表的主键(非空唯一)使用自增。
campus varchar(20) default ‘ck’
学生学校字符型默认约束为。重科
number varchar(10) unique key not null
学生学号只能是唯一且非空。
name varchar(20) not null
学生名字字符型不能为空。
结果如下:auto_increment=100,可以设置自增约束的初始值,charset='utf8’可以设置数据的编码格式。
(由于第一次charset打错被系统进行了报错)
6,外键约束(foreign key(需要约束的字段) references 表名(字段名))
前边讲的都是表格里面的约束,外键约束是指表与表之间的约束,例如这个学院专业分为A,B,C三个专业(字段名 专业 内容A,B,C),学生需要选择专业进行学习,此时专业字段为主键,学生选择专业为外键,此时外键中的内容(学生选择的专业)只能是来自主键的内容(A,B,C)。具体的应用将在表关系中举出。
二,表关系
1,一对多关系,如一个专业里面有多个学生。
如图专业表中有三个专业,代码编号为1,2,3。在另外以一个学生表中有4个学生他们将选取自己的专业,此时专业编码为主键,学生选择专业的专业为外键,此时外键的值只能是主键中1,2,3的其中一个。
在开始我们先创建一张专业表profession主键为p_id。之后我们创建一张学生表student,约束条件如下,最重要的是
foreign key(sp_id) references profession(p_id)
外键为student表的sp_id字段,主键为profession的p_id字段。
现在我们给专业表profession插入数据结果如图:
再给学生表student插入数据结果如图:
(如果我们写出(‘wl’,4)就会报错,因为主键中只有123,没有4)
如果我们此时想要删除计算机专业是会报错的,因为此时我们已经有学生在计算机专业进行学习。
如果我们想要强制删除(将命令写在删除命令的最后即可)
1,ascade命令(删除包含与键值有关系的所以记录)意思就是指删除计算机专业的同时删除选择计算机专业的人
2,set null 修改包含与己删除键值有关系的所有记录,使用null替换(只能用户标记为not null的字段)意思指删除计算机专业后,学生表中的sp_id中选择计算机(1)的同学会被自动改为NULL。
3,resitrict 拒绝删除要求,也就是我们开始删除报错时的情况(也就是默认设置,最安全的设置)
2,一对一关系,如学生姓名对应学生主键的详情信息。
如图在学生表中学生的编号(s_id)为1,2,3,4。将s_id做为主键
前边我们已经创建了学生表主键为s_id字段,我们只需要将学生详情表(stu_detail)中的s_id字段修改为唯一即可(满足主键的约束,又不能重复主键中的数,就可以实现一对一),在创建表时我们在最后加入一个
on delete cascade(表示在删除时遵循上边删除的第一个规则)
3,多对多关系,如课程与学生间,一个课程有多个学生学习,一个学生可以学习多门课程。
当学生(s-id)选择对应课程(c_id)时我们发现一个学生可以选择多门课程但是一个学生不能重复进行选课例如图中学生1在开始选择了课程1就不能再次选择课程1再选就会出错,为了避免这种情况的发生我们使用联合主键
也就是在设置主键时直接使用primary key(s_id,c_id)将两字段合并为一个约束条件为主键约束(非空且唯一)。
三,数据库三范式(个人理解)
第一范式
数据库的表不能想Excel一样在表头下再进行分裂,只能一个表头对应一列数据。
第二范式
对于一个项目可以将项目分成好几张表进行操作。
第三范式
第三范式是基于第二范式为基础,就是分裂的表中可以不用重复出现多次数据,比如名字不需要在每一张表中都出现。
事物
我们出错时撤回的方法