前言:
- 在前面我们已经学了数据库的增删查改(初阶),还没有学习的同学可以点击上面的连接进行跳转学习~~
- 本章就来学习数据库的进阶,让我们来一起走进吧~~
本节目标:
- 数据库约束
- 表的关系
- 删除
- 修改
- 查询
数据库约束
- 约束,就是数据库针对里面的数据能写啥,给出的一组"检验规则"
- 这样的约束,可以是程序猿人工来保证的,也可以是程序自动保证的
- 约束,就是为了提高效率,提高准确性,让数据库这个软件集成一个针对数据效验的功能
约束类型
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- DEFAULT - 规定没有给列赋值时的默认值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。
NULL约束
创建表时,可以指定某列不为空:
- 在没有约束的时候,此时表中可以插入空值!!!
create table student(id int,name varchar(20));
insert into student values(null,null);
- 这里我们重新创建一个表,设置成不能为空
create table student (id int not null, name varchar(20) not null);
- 非空约束也就生效了~~
UNIQUE:唯一约束
- 插入/修改数据的时候,会先查询,先看看数据是否已经存在,如果不存在,就能插入/修改成功,如果存在,则插入/修改失败!
- 可以看到数据已经插入了一次,就不能插入了
create table student (id int unique, name varchar(20));
DEFAULT:默认值
- 这里插入数据不指定name就会默认NULL
insert into student (id) values(2);
- 这里设置了默认值为
无名氏
,再次插入不指定默认列
create table student (id int,name varchar(20) default '无名氏');
PRIMARY KEY:主键
- 主键,一条记录,在表中的身份标识
- 也是要求唯一的,并且不能为空~~
- 主键 = unique + not null
- mysql要求一个表中只能有一个主键
- 创建主键的时候,可以使用一个列作为主键,也可以使用多个列作为主键(复合主键),这个很少见
create table student (id int primary key, name varchar(20));
- 当我插入一次数据后,再次插入,就不能了,看起来就是和not null + unique是类似的~~
insert into student values (1,'张三');
一个重要的问题:
- 如何给这个记录安排一个主键呢?
- mysql自身只是能够检查是否重复,设置的时候还是靠程序猿来设置~~
- 在这里,mysql提供了一个简单粗暴的办法,自增主键
create table student (id int primary key auto_increment, name varchar(20));
给自增主键插入数据的时候,可以手动指定一个值,也可以让mysql自己分配,如果让他自己分配,就在insert语句的时候,把id设为null即可
- 这里还可以手动分配
insert into student values(100,'赵六');
- 那么这里继续让mysql自己指定
insert into student values (null,'七七');
- 那么我再次指定·插入,再让mysq自己指定,那会是怎么样的呢?
- 可以看到,这里mysql还是继续默认浪费了~~
- 那么这里空间有浪费了吗?
- 这里分配的时候把这些序号跳过了,浪费了一部分序号,没有浪费空间
FOREIGN KEY:外键
- 两张表之间相互关联
create table class(class_id int primary key auto_increment, class_name varchar(20));
create table student(student_id int primary key auto_increment, name varchar(20),class_id int, foreign key (class_id) references class(class_id));
- 此时就要求student表中的每个记录的class_id得在class表的class_id中存在!
- 这个时候插入数据就会失败
- 这里写的是不能新增或者修改子
- 这里我们插入点班级数据
insert into class values(null,'cls1'); insert into class values(null,'cls2'); insert into class values(null,'cls3');
- 再次插入数据,就成功了
insert into student values(null,'张三',1);
- 换句话说student表插入数据的时候,mysql先会做一件事,会拿着这个记录的class_id去class表中看看有没有~~
- 不仅是插入,修改也会有约束
update student set class_id = 10 where student_id = 1;
- 那我们尝试把班级表中的class_id为1的记录给删了,会不会报错呢?
- 可以看到是不能删除的~~
CHECK
这个对于mysql5是不支持的,所以这里就先不讲了~~
表的设计
- 设计表要求有一定的经验,才能理解~~
- 设计表,分两步走
- 梳理清楚需求中的"实体"
- 梳理清楚实体之间的关系,按照关系,带入到既定的公式中
- 很多时候,每个实体就需要对应一张表来进行表示~~
实体之间的关系。主要有三种(严格来说是四种)
一对一
- 一个学生,只能有一个账号
- 一个账号,只能供一个学生所有
一对多
- 一个班级可以包含多个学生
- 一个学生只能处于一个班级
多对多
- 一个学生可以选择多个课程
- 一个课程也可以提供多个学生
- 一般来说只要实体和关系明确了,此时表的设计就差不多了~~
- 如果实体比较多,关系比较复杂,可以画一个实体关系图【ER图】来表示这个关系~~
MySQL | 数据库的表的增删改查【进阶】【万字详解】(二):https://developer.aliyun.com/article/1426797