当前位置: 首页 > news >正文

MySQL快速入门篇---数据库约束

一、什么是数据库约束

数据库约束是指对数据库中的数据所施加的规则或条件,用于确保数据的准确性和可靠性。

二、约束类型

约束可分为NOT NULL非空约束、DEFAULT默认约束、UNIQUE唯一约束、PRIMARY KEY主键约束、FOREIGN KEY外键约束、CHECK约束六种。每一种的作用都各不相同。

三、NOT NULL(非空约束)

定义表时某列不允许为NULL时,可以添加非空约束。
比如创建一个员工表,员工名为NULL时,这条记录是不完整的:

create table workers(id bigint comment '员工编号',name varchar(20) comment '员工姓名'
);
insert into workers values (1,null);
select * from workers;

查询结果如下所示:


此时我们就需要约束员工姓名的列不能为NULL:

drop table if exists workers;
create table workers(id bigint comment '员工编号',name varchar(20) not null comment '员工姓名'
);

此时我们再插入先前的数据:

insert into workers values (1,null);

运行后我们发现它报错了:
在这里插入图片描述
此时我们再插入正常值,发现可以成功插入:
在这里插入图片描述
然后我们查看表结构发现结构如下所示:
在这里插入图片描述
此时Null列id为YES,name为NO,这表示id列的值可以为null,而name列的值不能为null。

四、DEFAULT(默认值约束)

DEFAULT约束用于在列中指定默认值,如果一个列中没有设置值,那么便会将默认值设置到该列

更改员工表,在员工表中新增年龄列

drop table if exists workers;
create table workers(id bigint comment '员工编号',name varchar(20) not null comment '员工姓名',age int comment '年龄'
);

插入一条数据,不指定年龄,此时年龄列的值为null

在这里插入图片描述

更改员工表,为年龄加入默认值约束20

drop table if exists workers;
create table workers(id bigint comment '员工编号',name varchar(20) not null comment '员工姓名',age int default 20 comment '年龄'
);

插入一条数据,不指定年龄时使用了默认值

在这里插入图片描述

查看表结构,年龄列默认值为20

在这里插入图片描述

五、UNIQUE(唯一约束)

指定了唯一约束的列,该列的值在所有记录中不能重复,例如员工的编号,学生的学号等等。

更改员工表,新增工号列

drop table if exists workers;
create table workers(id bigint comment '员工编号',name varchar(20) not null comment '员工姓名',age int default 20 comment '年龄',sno varchar(10) comment '工号'
);

不设置唯一约束时,工号可重复
在这里插入图片描述

更改员工表,为工号设置唯一约束

drop table if exists workers;
create table workers(id bigint comment '员工编号',name varchar(20) not null comment '员工姓名',age int default 20 comment '年龄',sno varchar(10) unique comment '工号'
);

插入重复的工号,发现报错,唯一约束生效

在这里插入图片描述

查看表结构,UNI表示唯一约束

在这里插入图片描述

六、PRIMARY KEY(主键约束)

(1)主键约束唯一标识数据库中的每条记录
(2)主键必须包含唯一的值,且该值不为NULL
(3)每个表只能有一个主键,主键可以由单个列或多个列组成
(4)建议为每个表都设置一个主键

更改员工表,为id列添加主键

drop table if exists workers;
create table workers(id bigint primary key comment '员工编号',name varchar(20) not null comment '员工姓名',age int default 20 comment '年龄',sno varchar(10) unique comment '工号'
);

注意:主键同时拥有非空约束和唯一约束的特性

查看表结构,PRI代表主键约束
在这里插入图片描述

可为主键设置自动增长

drop table if exists workers;
create table workers(id bigint primary key auto_increment comment '员工编号',name varchar(20) not null comment '员工姓名',age int default 20 comment '年龄',sno varchar(10) unique comment '工号'
);

插入数据时不指定主键列的值,其会自动生成
在这里插入图片描述

查看表结构,Extra列显示auto_increment
在这里插入图片描述

复合主键:以多个列共同组成的主键

(1)更改员工表,设置id和name为复合主键

drop table if exists workers;
create table workers(id bigint,name varchar(20),primary key(id,name)
);

(2)插入两条id不同,名字都为张三的数据
在这里插入图片描述
这里能够正常插入是因为主键由id和name共同组成,有一个不一样就行

七、FOREIGN KEY(外键约束)

(1)外键用于定义主表和从表之间的关系
(2)外键约束定义在从表的列上,主表关联的列必须是主键或唯一约束
(3)当定义外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或者为null

具体实例如下所示:
在这里插入图片描述

创建班级表,并插入数据

drop table if exists class;
create table class(id bigint primary key auto_increment,name varchar(10) not null
);
insert into class values(1,'数学1班'),(2,'数学2班'),(3,'物理1班'),(4,'化学2班');
select * from class;

在这里插入图片描述

创建学生表,加入外键约束

drop table if exists student;
create table student(id bigint primary key auto_increment,name varchar(10) not null,age int default 18,class_id bigint,foreign key (class_id) references class(id)
);

查看学生表结构,发现Key列的值为MUL,表示外键约束
在这里插入图片描述

正常插入数据
在这里插入图片描述

插入班级号为6的学生,由于主表中没有这个班级,插入失败
在这里插入图片描述

插入班级id为NULL的记录,可以成功,表示当前学生还未分配班级
在这里插入图片描述

删除主表某记录时,从表中不能有对该记录的引用
在这里插入图片描述

注意:删除主表时要先删除从表

八、CHECK约束

CHECK 约束可以应用于一个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性

创建一个小说表,其中售价不得高于30,并插入一条数据售价大于30
在这里插入图片描述
我们发现它报错了,这就是check起了作用

本篇内容到这里就结束了,感谢各位看官观看,如果觉得本篇内容对你有用,可以一键三连支持一下哦

相关文章:

  • list的两种设计
  • 为什么需要启动探针(StartupProb)?
  • 2845. 统计趣味子数组的数目
  • PMP-第六章 项目进度管理(二)
  • 2025年深圳杯数学建模(东三省)B题【颜色转换】原论文讲解
  • 给文件内容加行号
  • 十一岁少年叶珉雪用艺术点亮公益之路 个人原创公益演唱会传递大爱与担当
  • JVM 一文详解
  • 轻量级RTSP服务模块:跨平台低延迟嵌入即用的流媒体引擎
  • 自定义Dockerfile,发布springboot项目
  • STL之list容器
  • 探索 C++23 std::to_underlying:枚举底层值获取的利器
  • [方法论]软件工程中的设计模式:从理论到实践的深度解析
  • [Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
  • leetcode0096. 不同的二叉搜索树-medium
  • 大型语言模型个性化助手实现
  • 深度学习经典网络之LeNet-5详解
  • 【BLE】【nRF Connect】 精讲nRF Connect自动化测试套件(宏录制、XML脚本)
  • 最大子段和 Java
  • 青少年编程与数学 02-018 C++数据结构与算法 24课题、密码学算法
  • 上海今日降雨降温,节后首个工作日气温回升最高可达28℃
  • 美国得克萨斯州发生5.4级地震,震源深度10千米
  • 社区来电催生?多地回应:系为居民提供卫生健康服务
  • 三百余英国王室藏品,一览爱德华时代的优雅
  • 西部航空回应飞机上卖彩票:与重庆福彩合作,仅部分航班售卖
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会