MySQL -- 表的约束

news/2025/3/15 18:58:31/

概念引入:真正的约束表字段的是数据类型,但是数据类型的约束方式比较单一的,所以需要一些额外的一些约束,用于表示数据的合法性,在只有数据类型一种约束的情况下,我们比较难保证数据是百分百合法。通过添加不同的约束,我们就可以确保未来插入数据库表中的数据是符合预期的。而约束的本质其实就是通过技术手段让程序员插入正确的数据。反过来,站在数据库的角度,凡是插入进来的数据,均为符合数据约束的。而约束的最终目的就是保证数据的完整性和可预测性,因为数据库是保存用户数据的最后一道防线。

1 、约束的常用类型

1.1 空属性

空属性约束其实还是比较常见的,我们在表中就经常可以看见,比如


上图中的NUll,其实就是空属性,如果没有设置,我们一般默认为可以空。

在我们存储的数据中很多其实是不可以为空的,所以这就是为什么很多网页需要你注册身份信息时,很多项其实是必填项。数据库在存储这类数据时,也会设置空属性的约束,确保一些信息不为空。下面用一些图来演示一下

a.创建表

在这里插入图片描述

设置三个变量,班级和教室不为空,其他可以为空

b.插入正常数据

在这里插入图片描述

这里我们插入非空数据,发现没有问题。

c.插入缺失的数据

在这里插入图片描述

这里我们不插入others ,说明others默认就是可以不为空

d.继续插入缺失数据

在这里插入图片描述

当我们继续插入缺失数据时,我们可以发现,如果将设置为not null 类型的数据空插会导致数据对其进行拦截。

1.2 默认值

默认值这条约束其实非常简单,就是在插入的时候,设置某一行的值,系统会自动帮忙补上。设置default值也非常简单,只需要在创建表时,在类型后加上设置的默认值,例:create table t1 ( age tinyint unsigned default 18);另外我们还可以将not null与default搭配使用,确保插入数据不为空,不过这两个一般不一起使用

1.3 列描述

这种约束其实无法通过desc命令来显示,实际上这就相当于是一种注释,用于给程序员或DBA进行了解。

在这里插入图片描述

在上图明显可以发现,desc命令显示不出comment的内容.想要看见就需要使用show create table name /G命令,结果如下图

在这里插入图片描述

1.4 zerofill

这种约束其实是用于改变表中的数字表现形式,就比如,数据类型为int(10)这里的10就表示插入表时,如果插入数据不足十位的话会自动补零,但是如果超过十位了,那么该是多少就是多少。

插入后

在这里插入图片描述
需要注意的是,如果我们没有显示的设定数据类型的宽度但是加了zerofill属性,这里int会默认的显示宽度是11,unsigned int 是10,符号位也占一个宽度。这种显示方式并不会影响数据库对数据的存储与操作。

1.5 主键

主键在一张表中具有唯一属性,通常我们就可以看成和操作系统的pid一样,用于标识数据,我们在创建表时,可以在表后加上primary表示设置该类型为主键。例如下图:

在这里插入图片描述

这里的id Key就是PRI,表示唯一。当我们插入同样的id值时,就会出现一些问题。同时,当原有的表中没有主键约束的时候,可以插入多个重复id数据,如果此时你想要为id加上约束,数据库就会对你的操作进行拦截,只有你把相同的id数据删除时,才可以重新设置约束<,所以我们一般约定,在表创建的时候就设定主键

在这里插入图片描述

我们可以发现,当再次插入id为2的数据时,我们就会发现,数据库会进行拦截。那么是不是没有办法插入相同的id数据了呢?当然不是,这里虽然主键只能有一个,但是一个主键可以附加在多列上。例如,我们可以让id和sore一起作为键值,这样id为2的数据就可以重复地插入。

下面把原来的主键删除,设置新的主键

在这里插入图片描述

尝试插入相同的id/score值,两列数据做键值时,也不能插入两列一样的值。

在这里插入图片描述

1.5.1 自增长

自增长这个属于主键的一种额外特性,这个自增长需要和主键搭配使用,而且只能有一列享有自增长这个属性。自增长顾名思义就是自动会增长,当我们第一次插入了数据。如果有一列有是主键并有自增长属性,那么后面假设不插入这列数据,数据库也会自动帮你补上。例如: 当我们将id设置成主键并加上自增长这个特性的话,我们会发现,哪怕我们第一次插入数据时没有设定id值,数据库也会默认帮我们补上0(一般默认是零,可以另外设置)。后续插入数据还没有设置的话,会自动补上并增长大小,以确保唯一性。当然,如果你中间突然显示插入一个id = 1000 的数据,那么下次默认补齐的id就从1001开始,这是因为表中会自动记录下次自增长的值。下面用几张图来举例,方便理解

先创建一个带自增长属性的表

在这里插入图片描述

不断插入数据,观察是否带其中一列数据是否自增长

在这里插入图片描述

我们可以发现,数据确实在自行增长,并在我们主动设置数据后,会在主动设置的数据后增长。

在这里插入图片描述

数据库会自动记录下次的auto_increment需要增长到的值

在这里插入图片描述

1.5.2 唯一键

唯一键和主键在功能上非常类似,唯一键是用于解决表中的唯一性约束问题。主要是因为每一张表只能拥有一个主键,但是我们还有许多的属性都需要唯一性的约束。所以唯一键的存在就变得合理了,唯一键和主键虽然在功能上非常相似,但在一些细节上还是有差异的。例如主键是不能为空,而唯一键可以为空。唯一键的主要作用就是为了保证不和别的信息出现重复。 一般我们在创建表时,在一条数据类型后加上unique即可即可

1.5.3 外键

外键(Foreign Key)是数据库中用于建立表之间关系的一种约束,这种约束其实还是非常常见的,如下图

在这里插入图片描述

外键的存在可以确保数据之间存在较好的关联性,就比如上图中,我们是没有办法在最上面那张表中插入别的球员,因为下面的表中并没有其他球员的信息。当然,外键也是可以为NULL,如果外键列允许NULL,则子表中的记录可以不与主表中的任何记录相关联。一旦主从表关联了,对应关联的数据中,子表中插入的主表必须存在,否则会报错,下面用一小段代码来演示主从表之间如何建立联系。

-- 主表(父表)
CREATE TABLE departments (department_id INT PRIMARY KEY,department_name VARCHAR(255)
);-- 子表(从表)
CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(255),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

外键也是可以有名称的,如果没有设置,数据库会自动设置。


http://www.ppmy.cn/news/1579378.html

相关文章

【ARM中R0寄存器】

ARM中R0寄存器 1 RO介绍1.1 R0 的主要作用1 函数返回值2 函数参数3 通用寄存器4 与其他寄存器的区别 1.2 示例 1 RO介绍 在ARM架构中&#xff0c;R0寄存器是一个通用寄存器&#xff1b;是16 个通用寄存器&#xff08;R0 到 R15&#xff09;中的第一个&#xff0c;通常用于存储…

面试总结:2024前端面试题

前几天写了一篇对面试官的吐槽&#xff0c;今天来总结一下最近面试的一些题目。题目不分具体公司了&#xff0c;毕竟题目的重复率不会特别高&#xff0c;就多做准备吧。 技术面还是离不开“八股文”&#xff0c;个人不喜欢也没办法&#xff0c;硬着头皮上&#xff0c;下面分几个…

离线服务器ollama新增qwen2:0.5b模型

离线服务器ollama新增qwen2:0.5b模型 Dify集成ollama前面已经介绍过离线服务器CentOS使用的docker安装的ollama&#xff0c;其中在ollama中已经安装了deepseek-r1:1.5b。目前的需求是需要再安装一个qwen2:0.5b的模型&#xff0c;那么如何安装呢&#xff1f; 1.首先在有网的服…

NAFNet:Simple Baselines for Image Restoration

Abstract 近年来&#xff0c;图像复原技术取得了长足的进步&#xff0c;但现有的图像复原方法&#xff08;SOTA&#xff09;系统复杂度也在不断增加&#xff0c;不利于对各种方法的分析和比较。在本文中&#xff0c;我们提出了一种简单的基线&#xff0c;它超越了SOTA方法&…

数据库MySQL原理(相关程序)

前言&#xff1a; MySQL数据库在存储数据、读取数据有着优秀的数据结构和算法。 接下来就来深入学习MySQL相关的操作和内部原理。 注&#xff1a;接下来对于mysql的相关操作都是在Linux环境下进行操作&#xff01;&#xff01; MySQL常用程序&#xff1a; 众所周知mysql是客户…

Apache Hudi 性能测试报告

一、测试背景 数据湖作为一个集中化的数据存储仓库,支持结构化、半结构化以及非结构化等多种数据格式,数据来源包含数据库数据、增量数据、日志数据以及数仓上的存量数据等。数据湖能够将这些不同来源、不同格式的数据集中存储和管理在高性价比的分布式存储系统中,对外提供…

思维链医疗编程方法论框架(Discuss V1版)

思维链医疗编程方法论框架 1. 方法论核心定义 思维链医疗编程方法论是一种结合结构化思维链(Chain of Thought)与医疗领域需求的系统化编程实践框架,旨在通过分步逻辑推理、知识整合与动态反馈,提升医疗软件/算法的开发效率、准确性与可解释性。该方法论的关键在于通过清晰…

基础知识《Redis解析》

Redis 详细解析与介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对&#xff08;Key-Value&#xff09;数据库&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表、集合等&#xff09;&#xff0c;广泛应用于缓存、消息队列、…