【MySQL】数据库约束

系列文章目录

第一章 数据库基础
第二章 数据库基本操作



前言

在学习了数据库的增删改查操作之后,接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据库约束是为了能够更稳妥的保证数据的安全,以更加严格的标准来管理数据。


约束关键字一览

  1. NOT NULL -表示某列不能存储NULL值
  2. UNIQUE -保证某列的每行必须有唯一的值
  3. DEFAULT -规定没有给列赋值时的默认值
  4. PRIMARY KEY -NOT NULL 和 UNIQUE的结合,确保某列的数据不为空且唯一
  5. 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的数据中,我们是无法删除的。
在这里插入图片描述


总结

对表属性进行约束能够更好的对数据进行管理和区分,也提高了代码的准确性,提升了工作效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值