【数据库初阶】MySQL中表的约束(上)

图片名称

??博主首页:

??专栏首页: 数据库初阶

??其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 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 复合主键

上一篇文章中,博主介绍了 :

  • 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 中显示的 DefaultNULL,这并不表示这个字段的默认值是 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: 0

    mysql> 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: 0

    mysql> 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)

  • 查看创建信息和表结构:

在这里插入图片描述

主键的特点与约束:

  • 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
  • 如果表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3361.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …

初识go语言之指针用法

一、环境准备 安装go语言编译环境,官网地址:https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 点击下载按提示安装即可 vscode 安装go语言扩展 测试 package mainimport "fmt"func main() {fmt.Println("Hello, World!") …

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…

2025.1.16——六、BabySQL 双写绕过|联合注入

题目来源:buuctf [极客大挑战 2019]BabySQL 1 目录 一、打开靶机,分析已知信息 二、手工注入解题 step 1:万能密码 step 2:正常注入,判断字段数 step 3:绕过 step 4:查数据库 step 5&am…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

Android CustomTextField

在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…

[0242].第4-3章:SpringBoot2核心技术笔记

Java学习大纲 1、笔记 第1步:框架初识 [0242-01].第01节:SpringBoot初识 第2步:入门项目 [0242-02].第02节:SpringBoot入门项目[0242-03].第03节:SpringBoot开发技巧 第3步:开发应用 配置文件&#xff1a…

2025.1.15——四、布尔注入

题目来源:ctfhub技能树 目录 一、基本操作:整理已知信息,得到本题为布尔注入 方法一:手工盲注(不推荐) step 1:判断具体形式 step 2:查询字段数 step 3:通过回显判…

Vue2.0的安装

1.首先查看是否已经安装了node.js 选择以管理员方式打开命令提示符(权限较高),或者通过cmd的方式打开 打开后输入node -v 查看自己电脑是否安装node,以及版本号 node -v 如果没有的话,请查看Node.js的安装 2.Vue和脚…

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库,右键选择 》任务 》导入数据 2、数据源 选择Excel,点击 下一步(Next) 3、目前 选择OLE DB Provider ,点击 下一步(Next) 4、默认 ,点击 下一步(Next)…

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…

如何保证光谱相机的稳定性和可靠性

光学系统设计与制造 高质量光学元件:采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差,确保光线准确聚焦;高质量的镀膜能够提高光学元件的透光率,降低反射损失,并且增强对不同波段光…

Python GUI Pyside6 实例笔记

例【1】 好的!我们将通过一个简单的案例来学习如何使用 PySide6 创建一个基本的桌面应用程序。这个案例将展示如何创建一个带有按钮的窗口,当点击按钮时,会弹出一个消息框。 1. 安装 PySide6 首先,确保你已经安装了 PySide6。如…

CIA-Access V2.5_9_2_10G EPON技术原理_关键技术

10G EPON关键技术,主要包含测距,突发光电技术,DBA以及线路加密。 关键技术之MPCP测距 第一个仍然是测距,每一个ONU到OLT的逻辑距离是不相等的,另外OLT与ONU之间的环路时间也会随着时间和环境的变化而变化,…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息&#xff0…

计算机网络 (43)万维网WWW

前言 万维网(World Wide Web,WWW)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义:万维网是一个分布式、联机式的信息存储空间,通过超文本链接的方式将分散的信息…

ubuntu18.04开发环境下samba服务器的搭建

嵌入式linux的发展很快,最近准备在一个新项目上采用新一代的linux核心板,发现linux内核的版本已经更新到5.4以上甚至6.0以上;之前常用的linux内核版本是2.6.4,虽然在某些项目上还能用但是明显跟不上时代的步伐了,所以要…

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

【论文阅读】基于空间相关性与Stacking集成学习的风电功率预测方法

文章目录 摘要0. 引言1. 空间相关性分析2. 风电功率预测模型2.1 Stacking 集成策略2.2 基学习器2.2.1 基于机器学习算法的基学习器2.2.2 基于神经网络的基学习器2.2.3 基于粒子群优化算法的超参数优化 2.3 元学习器2.4 基于空间相关性与Stacking集成学习的风电功率预测方法 3 算…