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

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起了作用

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

http://www.xdnf.cn/news/3626.html

相关文章:

  • 【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架
  • 驱动精灵v9.7(含网卡版)驱动工具软件下载及安装教程
  • 360驱动大师v2.0(含网卡版)驱动工具软件下载及安装教程
  • The Traitor King (10 player 25 player)
  • 【网络编程】HTTP(超文本传输协议)详解
  • 文献总结:TPAMI端到端自动驾驶综述——End-to-End Autonomous Driving: Challenges and Frontiers
  • 《解锁Windows下GCC升级密码,开启高效编程新旅程》
  • 游戏引擎学习第255天:构建配置树
  • 【AI面试准备】Testim.io自动化测试工具使用指南
  • C++ 友元:打破封装的钥匙
  • 【Linux】线程控制
  • 【PINN】DeepXDE学习训练营(12)——operator-antiderivative_aligned_pideeponet.py
  • 0902Redux_状态管理-react-仿低代码平台项目
  • Go小技巧易错点100例(二十八)
  • LeetCode240. 搜索二维矩阵 II(巧妙转换)
  • 【AI论文】DeepCritic:使用大型语言模型进行有意识的批判
  • Vscode+git笔记
  • 【Bootstrap V4系列】学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb)
  • 【Java Lambda表达式详解】
  • 学习黑客色即是空
  • 第3章 Python 3 基础语法001
  • 海外新版本开发高端Apple/科技汽车/共享投资理财平台系统
  • 【Python实战】飞机大战
  • DeepSeek辅助学术写作之提交和出版以及评审过程分析提示词分享祝你顺利毕业~
  • 创建第一个简单cesium程序
  • LeetCode - 19.删除链表的倒数第N个结点
  • 探索 C++23 std::to_underlying:枚举底层值获取的利器
  • 单片机嵌入式字符流数据解析库
  • YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测
  • AVFormatContext 再分析二