系列文章目录
第一章 数据库基础
第二章 数据库基本操作
文章目录
- 系列文章目录
- 前言
- 约束关键字一览
- NOT NULL
- UNIQUE
- DEFAULT
- PRIMARY KEY
- 自增主键
- FOREIGN KEY
- 总结
前言
在学习了数据库的增删改查操作之后,接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据库约束是为了能够更稳妥的保证数据的安全,以更加严格的标准来管理数据。
约束关键字一览
- NOT NULL -表示某列不能存储NULL值
- UNIQUE -保证某列的每行必须有唯一的值
- DEFAULT -规定没有给列赋值时的默认值
- PRIMARY KEY -NOT NULL 和 UNIQUE的结合,确保某列的数据不为空且唯一
- FOREIGN KEY -保证一个表中的数据匹配另一个表中的值的参照完整性
NOT NULL
在一个列中的数据不允许为空值。
以student表为例,在这个表中,Sno的NULL列表示YES,即允许Sno值为null
而以我们的日常生活经验来看,Sno是不允许为空的,因此我们需要为Sno加上约束Not Null 。
create table student(Sno int not null,name varchar(20));
接下来对数据进行插入操作,我们可以看到只有当Sno 不为空时,才能插入成功;当将Sno = null 或不插入Sno 的数据,则数据库就会校验报错。
UNIQUE
使用unique,在该列的数据不允许出现重复的情况,通常用于学号、身份证号等信息。
create table student(Sno int not null unique,name varchar(20) unique);
我们可以查看表结构,观察可知Sno 设置为not null + unique => Primary key
name设置为unique
对表进行插入操作,只有满足所有的约束条件才能够插入数据,可以通过下面的SQL案例进行分析。
当选择了unique约束之后,每次插入/修改操作都会先对数据进行查询,如果发现不符合条件才会返回失败的结果。这从侧面可以看出效率会降低,但出错的概率就大大减小了。
DEFAULT
设置默认值。 当进行指定列插入操作时,未被指定的列就会保持默认值。
以下面的SQL语句为例,插入的数据如果没有指定名称,那么就默认name = ’无名氏‘
create table student(id int not null unique,name varchar(20) default '无名氏');
PRIMARY KEY
主键 是一条数据的身份标识。主键是unique 和not null的结合体。
**一个表只能由一个主键,大多数情况主键使用的是整数形式,**但也可能会出现多个列的内容联合到一起构成的组件。
create table student(id int primary key , name varchar(20));
自增主键
为了解决主键不重复的问题,基于常用的以id作为主键的情况,MySQL提供了自增主键。顾名思义,在每次插入的数据中会在上一条数据的值+1.自增主键的关键字为auto_increment
create table student(id int primary key auto_increment,name varchar(20));
当对主键采用自增形式之后,我们可以通过下图的SQL操作得到id在不指定时是自动增加的。即便在数据中没有数据,那么id就会自动从1开始。
通过自增主键,我们就不需要每次都添加id的数据了,如果用户误操作将id值设置为null,MySQL也可以自动使用自增主键将它补上。当然,SQL也支持我们主动插入数据。
insert into student values(100,'lisi');
当我们插入id = 100的数据后,我们可以成功查询到数据,那么2-99的数据应该如何处理?在MySQL中是直接废弃掉的,从100之后开始继续自增。
FOREIGN KEY
外键的约束用于两张表之间的关联关系。为了能够连接两个表,外键要么是主键,要么是unique 在建立外键约束之后,后续对子表进行操作就会频繁涉及到两个表之间的操作。
以学生和班级之间的关系为例,在学生表中不仅有学号id,姓名name,同时还有关联着班级表的classId,而classId就是它的外键。同时还有班级表,里面有班级编号classId、班级名称className
//创建class表
create table class(classId int primary key auto_increment,className varchar(20));
//创建student表
create table student(id int primary key auto_increment,name varchar(20),classId int,foreign key(classId) references class(classId));
通过foreign key将student表中的classId与class表中的classId相关联。
原则上来说,在student表中插入的classId必须要在class表中存在。class表制约student表,而student表属于被制约的一方。因此他们之间也被成为父子表。
以下面的SQL语句我们可以看到,当class表中不存在id = 1 的数据时,MySQL将会报错。而当class表中存在对应的数据,则可以插入成功。
那么我们可以直接删除class表中的数据吗?
在下面的class表中,我们删除的classId = 100的数据是不被student表关联的,因此可以成功删除。
而在存在关联的classId = 1的数据中,我们是无法删除的。
总结
对表属性进行约束能够更好的对数据进行管理和区分,也提高了代码的准确性,提升了工作效率。