MySQL:表的约束(上)
文章目录
- 空属性
- 默认值
- 列描述
- zerofill
- 主键
本篇总结的是MySQL中关于表的约束部分的内容
空属性
在进行表的创建时,会有两个值,null和not null,而数据库默认的字段基本都是空,但是在实际的开发过程中要保证字段不能为空,因为数据为空就意味着不能进行参与运算
mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)mysql> select 1+null;
+--------+
| 1+null |
+--------+
| NULL |
+--------+
1 row in set (0.00 sec)
如上所示,数据为空时不能进行运算的
比如,当创建一个班级表,这个表中包含的信息有班级名和班级所在的教室的时候,如果站在一个正常的业务逻辑的角度来讲,班级没有名字就不知道是哪个班级,教室没有名字就不知道在哪上课,于是在进行设计的时候,要对于表进行限制,使得只有满足这个条件才能插入到数据表中,这就是所谓的约束
我们创建一个这样的MySQL数据库:
mysql> create table myclass( class_name varchar(20) not null, class_room varchar(10) not null );
Query OK, 0 rows affected (0.07 sec)mysql> desc myclass-> ;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(10) | NO | | NULL | |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
这样,就对于元素添加了限制的字样,自此之后,如果想要添加数据就必须要填写名字和教室了,如果不填写是不可以插入进去的:
mysql> insert into myclass (class_name) values ('yuwen');
ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
mysql> insert into myclass (class_room) values ('class1');
ERROR 1364 (HY000): Field 'class_name' doesn't have a default value
mysql> insert into myclass (class_name, class_room) values ('yuwen', 'class1');
Query OK, 1 row affected (0.01 sec)
默认值
下一个约束是默认值,默认值的意思是,对于某一种数据会经常性的出现某个具体的值,就可以在一开始就指定好,之后在插入数据的时候如果没有需要就用默认值,需要就插入正常值
比如在程序员统计的时候,大多数程序员都是男性,所以在统计性别的时候可以默认选择男性,如果有女性的信息也没关系,可以直接插入,具体如下所示:
mysql> create table info (-> name varchar(20) not null,-> age tinyint unsigned default 0,-> sex char(2) default '男'-> );
Query OK, 0 rows affected (0.11 sec)mysql> desc info;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| name | varchar(20) | NO | | NULL | |
| age | tinyint unsigned | YES | | 0 | |
| sex | char(2) | YES | | 男 | |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
如上所示,创建了一个人的信息表,其中包含有名字,年龄,性别,其中名字不可以忽略,而年龄和性别都设置了缺省值
所以,在插入数据的时候,对于默认值可以选择插入也可以选择不插入:
mysql> insert into info (name, age, sex) values('小明', 15, '男');
Query OK, 1 row affected (0.01 sec)mysql> insert into info (name, age) values('小亮', 16);
Query OK, 1 row affected (0.00 sec)mysql> insert into info (name) values('小宏');
Query OK, 1 row affected (0.01 sec)mysql> insert into info (name, sex) values('小红', '女');
Query OK, 1 row affected (0.00 sec)mysql> select * from info;
+--------+------+------+
| name | age | sex |
+--------+------+------+
| 小明 | 15 | 男 |
| 小亮 | 16 | 男 |
| 小宏 | 0 | 男 |
| 小红 | 0 | 女 |
+--------+------+------+
4 rows in set (0.00 sec)
由此可以看出,默认值其实是生效了的
列描述
下一个介绍的约束项是列描述,它的意思就是用来描述一个字段,用来给程序员看的,比如:
mysql> create table commentinfo(-> name varchar(20) comment '要写入的是姓名',-> sex char(2) comment '要写入的是性别'-> );
Query OK, 0 rows affected (0.04 sec)
此时,如果直接进行desc是看不到这个表的信息的,但是如果选择的是show create table就可以看到了:
mysql> desc commentinfo;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> show create table commentinfo\G
*************************** 1. row ***************************Table: commentinfo
Create Table: CREATE TABLE `commentinfo` (`name` varchar(20) DEFAULT NULL COMMENT '要写入的是姓名',`sex` char(2) DEFAULT NULL COMMENT '要写入的是性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
zerofill
下一个要介绍的约束项是,zerofill,比如在创建一个数据类型的时候可能填写的是int(10):
mysql> create table t1 (-> lenth int(10)-> );
Query OK, 0 rows affected, 1 warning (0.04 sec)mysql> desc t1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| lenth | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
那么这个10是什么意思呢?而这个10其实是和zerofill关系起来的,我们给这个lenth这一列添加上zerofill的关键字设置:
mysql> alter table t1 change lenth lenth int(5) unsigned zerofill;
Query OK, 0 rows affected, 2 warnings (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 2
此时插入信息进行查看,就会发现这个现象:
mysql> insert into t1 (lenth) values (1);
Query OK, 1 row affected (0.01 sec)mysql> select *from t1;
+-------+
| lenth |
+-------+
| 00001 |
+-------+
1 row in set (0.00 sec)
可以看到,本来应该存储的是1,现在变成了00001,这个就是zerofill属性的作用,如果宽度小于设定的宽度,那么就自动填充0,但是实际在存储的时候还是存储的是1,只是进行了一个格式化的输出而已
主键
主键表示的是标识字段里面的数据,不能重复,不能为空,一个表中最多只能有一个主键,主键所在的列通常是整数类型
mysql> create table t2 (-> id int unsigned primary key comment '学号不能重复',-> name varchar(20) not null);
Query OK, 0 rows affected (0.03 sec)mysql> desc t2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
这样就创建了主键,下面进行插入数据:
mysql> insert into t2 (id, name) values(123, '小明');
Query OK, 1 row affected (0.00 sec)mysql> insert into t2 (id, name) values(123, '小红');
ERROR 1062 (23000): Duplicate entry '123' for key 't2.PRIMARY'
当插入两个相同id的信息时,就会报错,这说明id是不可以被重复的,因为它是主键
这里需要注意的是,主键只有一个,并不意味着只能给一列添加主键,还存在一个复合主键,可以给多个列添加,这写列合起来作为主键
相关文章:
MySQL:表的约束(上)
文章目录 空属性默认值列描述zerofill主键 本篇总结的是MySQL中关于表的约束部分的内容 空属性 在进行表的创建时,会有两个值,null和not null,而数据库默认的字段基本都是空,但是在实际的开发过程中要保证字段不能为空ÿ…...

树莓派5使用体验
原文地址:树莓派5使用体验 - Pleasure的博客 下面是正文内容: 前言 好久没有关于教程方面的博文了,由于最近打算入门嵌入式系统,所以就去购入了树莓派5开发板 树莓派5是2023年10月23日正式发售的,过去的时间不算太远吧…...

代码随想录算法训练营第42天| 背包问题、416. 分割等和子集
01 背包 题目描述:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包: 确定dp数组以及下标的含义 …...
Node.js安装及环境配置指南
Node.js安装及环境配置指南 一、Node.js的安装 安装Node.js之前,首先需要确保你的电脑已经安装了合适的编译器和开发环境。Node.js是一个开源的、跨平台的JavaScript运行环境,它使得JavaScript可以在服务器端运行。 下载Node.js安装包 访问Node.js的…...

【Java基础】面试题汇总
Java基础面试题1. JVM vs JDK vs JRE 2. 什么是字节码?采用字节码的好处是什么?3. 为什么说 Java 语言“编译与解释并存”?4. AOT 有什么优点?为什么不全部使用 AOT 呢?5. Java 和 C 的区别?6. Java 中的基本数据类型࿱…...
数据库事务的超级详细讲解,包括事务特性、事务隔离级别、MVCC(多版本并发控制)
数据库事务: 主要有事务特性,事务的隔离级别,MVCC。 事务特性: 事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功执行,要么全部不执行ÿ…...

鸿蒙Lottie动画-实现控制动画的播放、暂停、倍速播放、播放顺序
介绍 本示例展示了lottie对动画的操作功能。引入Lottie模块,实现控制动画的播放、暂停、倍速播放、播放顺序、播放到指定帧停止或从指定帧开始播放、侦听事件等功能,动画资源路径必须是json格式。 效果预览 使用说明: 进入页面默认开始201…...
C++面试100问与自动驾驶100问
C的学习和面试其实是非常的不友好的,首先C的学习内容非常的多,其次C的面试不单单面试C的知识点,还有它的“七大姑八大姨”(计算机网络、数据结构、算法、计算机组成原理、操作系统、编译、xxx的底层实现 and so on)。 …...
加速 Redis 操作:掌握管道技术提升性能与效率
Redis 管道技术是一种用于优化 Redis 命令执行效率的机制。在传统的 Redis 操作中,每次向 Redis 服务器发送一个命令,都需要等待命令执行完成并返回结果,这样会导致频繁的网络通信和服务器端的命令执行开销,降低系统的性能和吞吐量…...

深入浅出 -- 系统架构之分布式系统底层的一致性
在分布式领域里,一致性成为了炙手可热的名词,缓存、数据库、消息中间件、文件系统、业务系统……,各类分布式场景中都有它的身影,因此,想要更好的理解分布式系统,必须要理解“一致性”这个概念。 其实关于…...

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页
一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统,结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 ,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发)&…...

xss【2】
1.xss钓鱼 钓鱼攻击利用页面,fish.php黑客钓鱼获取到账号密码存储的位置 xss进行键盘记录 2.xss常规防范 3.xss验证payload XSS(跨站攻击)_details/open/ontoggle-CSDN博客...

时序分解 | Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序列信号分解
时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序…...

css- 4
1.浮动 1. 浮动最初用于实现文字环绕效果 2. 现在,浮动是主流的布局方式之一 1.1元素浮动之后的特点 元素浮动之后,称为浮动元素,具有如下特点: 1. 浮动元素脱离文档流 2. 多个浮动的元素会水平排列,一行放不下自动换…...
22.括号生成
题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2: 输入…...

JAVA八股--redis
JAVA八股--redis 如何保证Redis和数据库数据一致性redisson实现的分布式锁的主从一致性Redis脑裂现象及解决方案介绍I/O多路复用模型undo log 和 redo log(没掌握MyISAM 和 InnoDB 有什么区别? 如何保证Redis和数据库数据一致性 关于异步通知中消息队列…...

[图像处理] MFC载入图片并绘制ROI矩形
上一篇: [图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示 文章目录 前言完整代码重要代码效果 前言 上一篇实现了MFC通过Picture控件载入图片。 这一篇实现ROI功能的第一部分,在Picture控件中,通过鼠标拖拽画出一个矩形。 完…...

Godot 4 教程《勇者传说》依赖注入 学习笔记(0):环境配置
文章目录 前言相关地址环境配置初始化环境配置文件夹结构代码结构代码运行 资源文件导入像素风格窗口环境设置背景设置,Tileap使用自动TileMap 人物场景动画节点添加站立节点添加移动动画添加 通过依赖注入获取Godot的全局属性项目声明 当前项目逻辑讲解角色下降添加代码位置问…...
强行让Java和Go对比一波[持续更新]
概述 很多Java开发如果想转Golang的话,比较让Java开发蛋疼的第一是语法,第二是一些思想和设计哲学的Gap,所以我这儿强行整理一波Java和Golang的对比,但是由于GO和Java在很多方面都有不同的设计,所以这些对比的项可以更…...
理解七层网络协议
osi体系结构 上三路(管数据) 应用层 通过http等,把传输的格式,数据打包 处理网络应用。直接为端用户服务,提供各类应用过程的接口和用户接口。例如:HTTP、Tenlent、FTP、SMTP、NFS等。基于TCP的FTP、HTTP…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...