【数据库初阶】MySQL中表的约束(上)
亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL中表的约束 帮助您轻松入门,快速掌握核心概念。
如果文章对您有所启发或帮助,请别忘了 点赞 👍、收藏 🌟、留言 📝 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!
文章目录
- @[toc]
- `0. 什么是表的约束`
- `1. NULL & NOT NULL`
- 🎧1.1 关键词解释🎧
- 🎧1.2 用法示例🎧
- `2.DEFAULT`
- 🎧2.1 关键词解释🎧
- 🎧2.2 用法示例🎧
- 🎧2.3 NOT NULL 和 DEFAULT 区别🎧
- `3.COMMENT`
- 🎧3.1 关键词解释🎧
- 🎧3.2 用法示例🎧
- `4.ZEROFILL`
- 🎧4.1 关键词解释🎧
- 🎧4.2 用法示例🎧
- `5. PRIMARY KEY`
- 🎧5.1 关键词解释🎧
- 🎧5.2 用法示例🎧
- 5.2.1 单列主键
- 5.2.2 复合主键
文章目录
- @[toc]
- `0. 什么是表的约束`
- `1. NULL & NOT NULL`
- 🎧1.1 关键词解释🎧
- 🎧1.2 用法示例🎧
- `2.DEFAULT`
- 🎧2.1 关键词解释🎧
- 🎧2.2 用法示例🎧
- 🎧2.3 NOT NULL 和 DEFAULT 区别🎧
- `3.COMMENT`
- 🎧3.1 关键词解释🎧
- 🎧3.2 用法示例🎧
- `4.ZEROFILL`
- 🎧4.1 关键词解释🎧
- 🎧4.2 用法示例🎧
- `5. PRIMARY KEY`
- 🎧5.1 关键词解释🎧
- 🎧5.2 用法示例🎧
- 5.2.1 单列主键
- 5.2.2 复合主键
上一篇文章中,博主介绍了 :
- MySQL中不同的数据类型
建议将上一篇文章看完之后再来看这篇文章,链接如下:
【数据库初阶】MySQL数据类型那么接下来正文开始:
0. 什么是表的约束
- 上一篇文章中讲过,真正表的约束其实是 数据类型;
- 但是数据类型约束很单一,需要有一些 额外的约束,更好的保证 数据的合法性,从业务逻辑角度 保证数据的正确性。
- 表的约束有很多,本篇文章主要介绍以下几个:
null / not null,default,comment,zerofill,primary key,auto_increment,unique key
1. NULL & NOT NULL
🎧1.1 关键词解释🎧
NULL就是空,什么都没有的意思,和语言上的NULL是有点区别的;- 在数据库创建中,如果从逻辑角度不想让某一个字段(某一列)为空,就要添加约束条件,
NOT NULL。
🎧1.2 用法示例🎧
- 例如,在学校中,从逻辑上讲,每个学生的学号都不可能是空值;
- 因此可以将这个字段添加约束
NOT NULL; SQL代码如下:
mysql> create table if not exists null_test(-> stu_id varchar(10) not null,-> stu_name varchar(10),-> stu_class int-> );
- 查看一下表结构,输入:
desc null_test;

- 此时,必须在这个表中的每一行添加这个字段的值,不然就会报错:

2.DEFAULT
🎧2.1 关键词解释🎧
- 在一张表中,某一个字段的值可能 出现的频率比较高;
- 为了避免重复的输入,可以将这个字段添加约束
DEFAULT默认值; - 下次就不需要手动进行插入,会自动添加到表中;
- 如果某一行中此字段的值不是默认值,再手动修改,大大提高了效率。
🎧2.2 用法示例🎧
- 例如,在理工类学校中,男生的人数可能比女生的人数要多很多;
- 那么就可以将性别这个字段添加默认值;
- 代码如下:
mysql> create table if not exists default_test(-> stu_id int not null,-> gender char(1) default '男',-> age int unsigned -> );
Query OK, 0 rows affected (0.05 sec)
- 查看表结构:

- 省略
gender字段向表中插入数据,那就是默认值,不省略就可以修改:

🎧2.3 NOT NULL 和 DEFAULT 区别🎧
问题1:
- 先来看下面的一个插入方式,为什么在创建的时候
age字段没有设置默认值,插入的时候也可以被省略?

- 实际上,对于不是
NOT NULL的字段,MySQL会自动帮我们添加 默认值NULL,我们可以查看一下MySQL为我们修改的创建表的语法:

问题2:
- 我们可以看到:非空约束的默认值也是
NULL,为什么呢?

- 其实这个
NULL的本质是不一样的,如果我们不指定stu_id列插入数据看一下:- 可以看到,这里的报错是 没有默认值报的错。

- 如果我们指定了这个列,但是插入的是空值看一下:
- 注意到,这里的报错是 此列不能是空报的错。

- 因此,在定义非空约束的表中,
MySQL不会帮我们自动生成一个默认值; - 对于带有
NOT NULL约束的字段,DESC中显示的Default为NULL,这并不表示这个字段的默认值是NULL。实际上,NOT NULL约束要求这个字段在插入时不能是NULL,如果插入时没有提供这个字段的值,MySQL会报错,报的是没有默认值的错误。
总结:
-
对于是非空约束的字段:
MySQL不会帮我们自动生成一个默认值,如果我们在插入数据的时候不显示指定此列,那么编译器就会报没有默认值的错误;- 如果插入数据的时候显示插入值,但是插入的值是
NULL,才会报自此段不能为空的错误。
-
对于不是非空约束的字段:
MySQL会自动帮我们生成一个默认值NULL,所以不会报没有默认值的错误。- 因为只有设置了
default的列,才可以在插入值的时候,对列进行省略。
-
一般情况下,
default约束和not null约束不会一起使用。
3.COMMENT
🎧3.1 关键词解释🎧
comment表示列描述,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;
🎧3.2 用法示例🎧
- 创建一个表,描述各个列的含义;
- 代码如下:
mysql> create table if not exists comment_test(-> name varchar(20) not null comment '姓名',-> age tinyint unsigned default 18 comment '年龄',-> gender char(1) default '男' comment '性别'-> );
Query OK, 0 rows affected (0.08 sec)
desc是查不到注释信息的:

- 通过
show create table可以看到:

4.ZEROFILL
🎧4.1 关键词解释🎧
- 还记得在上一篇文章中讲的数据类型
int吗,在查表的时候后面的数字代表着什么呢? - 其实没有这个
zerofill属性,这个数字是没有意义的; - 其实这个表示最后用统一的字数显示,如果是 10 10 10,那么最后就是显示 10 10 10位数字,如果实际数字少于 10 10 10 位,就用 0 0 0 补齐,如果多出就不管。
🎧4.2 用法示例🎧
- 创建一个表,里面只有
int,一个int(5),另一个int(10)这个用zerofill约束; - 代码如下:
mysql> create table if not exists zerofill_test(-> a int(5),-> b int(10) unsigned zerofill-> );
- 插入数据,代码如下:
mysql> insert into zerofill_test values(1,2);
Query OK, 1 row affected (0.01 sec)mysql> insert into zerofill_test values(325, 510);
Query OK, 1 row affected (0.01 sec)
- 查表:
mysql> select * from zerofill_test;
+------+------------+
| a | b |
+------+------------+
| 325 | 0000000510 |
| 1 | 0000000002 |
+------+------------+
2 rows in set (0.00 sec)
- 其实
int默认是 10 10 10 位也是有原因的,因为它的最大值就是二十一亿多( 10 10 10 位数字),unsigned也就是四十二亿多( 10 10 10 位数字)。
5. PRIMARY KEY
🎧5.1 关键词解释🎧
primary key用来 唯一的 约束该字段里面的数据,不能重复,不能为空;- 主键要求表中每一行记录的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。
- 主键字段不能为
NULL。也就是说,在定义主键时,MySQL会自动给该字段添加NOT NULL约束。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。
- 一张表中最多只能有 一个主键,但可以由一个列或多个列组成(复合主键)。
- 主键可以由一列或多列字段组成。一个单列主键称为“单列主键”,而由多个列组成的主键称为“复合主键”。
- 单列主键:表中只有一个字段作为主键。
- 复合主键:多个字段组合成一个主键,保证唯一性。
- 主键可以由一列或多列字段组成。一个单列主键称为“单列主键”,而由多个列组成的主键称为“复合主键”。
- 主键所在的列通常是 整数类型。
🎧5.2 用法示例🎧
5.2.1 单列主键
- 可以用以下两种方式定义主键:
#方法1:
mysql> create table if not exists primarykey_test(-> stu_id int,-> name varchar(20),-> gender char(2) default '男',-> primary key(stu_id)-> );
Query OK, 0 rows affected (0.04 sec)# 方法2:
mysql> create table if not exists primarykey_test(-> stu_id int primary key,-> name varchar(20),-> gender char(2) default '男',-> );
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息:
- 发现自动添加了
NOT NULL约束。
- 发现自动添加了

- 插入信息,发现如果有了主键约束,此列信息不能重复:

- 可以删除主键,代码如下:
mysql> alter table primarykey_test drop primary key;
Query OK, 1 row affected (0.16 sec)
Records: 1 Duplicates: 0 Warnings: 0mysql> desc primarykey_test;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

- 删除后可以重新添加,但要 保证添加这一列中没有重复的值!!
mysql> alter table primarykey_test add primary key(stu_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc primarykey_test;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


5.2.2 复合主键
- 定义方法,代码如下:
- 这个表中定义主键的意思是一个学生可以选择多门课,一门课可以被多名学生选择,但是 不存在一名学生重复选择同样的课的情况。
mysql> create table if not exists primarykey_test2( -> stu_id int, -> course_id int, -> grade int, -> primary key(stu_id, course_id)
);
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息和表结构:

主键的特点与约束:
- 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
- 如果表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。
相关文章:
【数据库初阶】MySQL中表的约束(上)
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL…...
173. 矩阵距离 acwing -多路BFS
原题链接:173. 矩阵距离 - AcWing题库 给定一个 N行 M 列的 01矩阵 A,A[i][j] 与 A[k][l]]之间的曼哈顿距离定义为: dist(i,j,k,l)|i−k||j−l|| 输出一个 N 行 M 列的整数矩阵 B,其中: B[i][j]min1≤x≤N,1≤y≤M,A…...
Linux下部署Redis集群 - 一主二从三哨兵模式
三台服务器redis一主二从三哨兵模式搭建 最近使用到了redis集群部署,使用一主二从三哨兵集群部署redis,将自己部署的过程中的使用心得分享给大家,希望大家以后部署的过程减少一些坑。 服务器准备 3台服务器 ,确定主redis和从red…...
实战设计模式之建造者模式
概述 在实际项目中,我们有时会遇到需要创建复杂对象的情况。这些对象可能包含多个组件或属性,而且每个组件都有自己的配置选项。如果直接使用构造函数或前面介绍的工厂方法来创建这样的对象,可能会导致以下两个严重问题。 1、参数过多。当一个…...
活动预告 | Microsoft Azure 在线技术公开课:使用 Azure OpenAI 服务构建生成式应用
课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“使用 Azure OpenAI 服务构建生成式应用”活动,了解如何使用包括 GPT 在内的强大的…...
ubuntu安装firefox
firefox下载地址:https://ftp.mozilla.org/pub/firefox/releases/ 卸载 sudo apt-get update dpkg --get-selections |grep firefox apt-get purge firefox 解压 tar -xjf firefox*.tar.bz2复制文件 sudo mv firefox/ /opt/firefox30sudo mv /usr/bin/firefox /…...
计算机网络原理(谢希仁第八版)第4章课后习题答案
第四章 网络层 详细计算机网络(谢希仁-第八版)第四章习题全解_计算机网络第八版谢希仁课后答案-CSDN博客 1.网络层向上提供的服务有哪两种?是比较其优缺点。网络层向运输层提供 “面向连接”虚电路(Virtual Circuit)服…...
RabbitMQ-基本使用
RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…...
从零开始学架构——互联网架构的演进
1 技术演进 1.1 技术演进的动力 对于新技术,我们应该站在行业的角度上思考,哪些技术我们要采取,哪些技术我们不能用,投入成本过大会不会导致满盘皆输?市场、技术、管理三者组成的业务发展铁三角,任何一个…...
python +tkinter绘制彩虹和云朵
python tkinter绘制彩虹和云朵 彩虹,简称虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱,由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…...
重新整理机器学习和神经网络框架
本篇重新梳理了人工智能(AI)、机器学习(ML)、神经网络(NN)和深度学习(DL)之间存在一定的包含关系,以下是它们的关系及各自内容,以及人工智能领域中深度学习分支对比整理。…...
TypyScript从入门到精通
TypyScript从入门到精通 TypyScript 是什么?增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型:3.…...
【MATLAB】绘制投资组合的有效前沿
文章目录 一、数据准备二、有效前沿三、代码3.1 数据批量读取、预处理3.2 绘制可行集3.3 绘制有效前沿3.4 其它-最大夏普率 一、数据准备 准备多个股票的的历史数据,目的就是找到最优的投资组合。 下载几个标普500里面的公式的股票数据吧,下载方法也可…...
matlab时频分析库
time frequency gallery...
GBase 8s 数据库备份还原
每一天都是一个新的篇章,等待着你去书写属于自己的故事!!! 一:备份 1.1.下载脚本文件,并上传到数据库服务器上相应目录。 解压后目录为: 说明: dbcomm.sh:导出注释脚本…...
C++模板相关概念汇总
文章目录 一、模板的概念与作用二、函数模板模板的非类型参数调用顺序 三、类模板四、模板的编译模型 一、模板的概念与作用 C模板是一种强大的代码复用机制,它允许程序员编写通用的代码,能够处理不同类型的数据,而无需为每种类型都重复编写…...
MYSQL------sql基础
SQL基础与简介 定义:SQL即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,用于存取数据以及查询、更新和管理关系数据库系统。作用:可以用于数据库的创建、数据的插入、查询、更新和…...
React Router 用法概览
React Router 用法 React 使得开发者能够轻松地创建交互式的单页应用(SPA),单页应用的一个常见挑战是如何处理页面导航和路由吗,React Router 就是解决这个问题的工具 路由(Router)是 React Router 的核心…...
网络安全之高防IP的实时监控精准防护
高防IP是一种网络安全设备,用于保护网络服务不受到各类攻击的影响,确保业务的持续稳定运行。它通过监控、识别和封锁恶意攻击流量,提供高级别的防护,降低业务被攻击的风险,并提升网络的稳定性和可靠性。 一、实时监控的…...
2024年中国新能源汽车用车发展怎么样 PaperGPT(二)
用车趋势深入分析 接上文,2024年中国新能源汽车用车发展怎么样 PaperGPT(一)-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程:2024年纯电车辆月均行驶超过1500公里&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
