一、约束的定义

MySQL 约束是用于限制表中数据的规则,确保数据的 准确性一致性 。约束可以在创建表时定义,也可以在表创建后通过修改表结构添加。

二、常见的约束类型

2.1 NOT NULL 非空约束

加了非空约束的列不能为 NULL 值,如果可以预见某个列不可能为空,例如(性别:男 或 女 或者 保密)建议都加上非空约束,有利于查询效率的提高

这里创建一个 student 表,没有添加任何约束

我们可以往表里添加 NULL 数据,但这是无意义的

接下来通过修改表给 name 列添加上非空约束

数据库报错:不能对已经有 NULL 的列添加 非空约束

可以通过将带有 NULL 的数据删除或者将列删除重新创建来进行修改吗?

这里选择删除列后再重新创建,再尝试往 name 列里添加 NULL

数据库报错:'name' 列不能为空

对表进行查看可以看到 name 的 NULL 列变成 NO 了

但是数据依然存在,所以还是需要通过 删除数据 来进行修改,但数据量大时也不方便。所以最好还是在一开始创建表时就对每个数据做好分析,提前选择好约束

2.2 DEFAULT 默认值约束

当某个列没有被插入指定数据时则为默认值

插入数据时注意不能使用全列插入

数据库报错:列的数量和输入值的数量不一致

只能使用指定列插入才可以

查看表可以看到,hobby 列的 DEFAULT 的被修改为了 '无'

2.3 UNIQUE 唯一约束

当我们遇到需要存入不能重复的数据时(例如:身份证号,学号等等)就可以使用 UNIQUE 来指定唯一约束的列

添加约束前

将 id 列添加 UNIQUE 约束后再进行添加数据

数据库报错:添加键中的值 1 与列中值重复

注意:只添加了 UNIQUE 的列可以写入多个 NULL

查看表可以看到,id 列的 KEY 的添加了 UNI 表示不可重复

2.4 PRIMARY KEY 主键约束

主键约束唯一标识数据库表中的每条几率,可以理解为当前数据行的身份信息

主键必须包含唯一的值,且不能包含 NULL 的值(唯一且非空)

  • 既然是唯一且非空是否能用 id int unique not null 来代替主键呢?答案是不可以的,这里要区分开unique not null 是业务对数据本身的需求,primary key则是表的特性,数据如何组织依赖主键

通常为每张表指定一个主键,主键列建议使用 BIGINT 类型(范围够大)

重新创建表 student

查看表可以看到,id 列的 Key 变为了 PRI

因为 PRIMARY KEY 的特性一般把主键设为自动增长 (auto_increment),插入数据对应字段不给值时,使用最大值+1。

语法:

id INT PRIMARY KEY auto_increment,

可以看到 Extra 处已经有了 自增标识,写入数据时就不用人为的去维护主键值。

可以使用指定列插入

也可以用全列插入,但是需要指定为值为 NULL(并不是为空,而是让数据库去填写)

可以通过命令 show create table 表名 来查看表的具体信息

这里的 AUTO_INCREMENT = 4 是告诉我们下个存入的数据 ID 会等于 4,如果已经设置了自动增长还主题设置 ID 值呢?数据是可以被正常添加的

AUTO_INCREMENT 的值会来到101,如果再添加一个 ID 为 4 的值,也是能正常添加的

但是 AUTO_INCREMENT 的值不会再变小,这是基于对数据的安全考虑,中间浪费的区间也能是浪费了。
每个表只能有一个主键,可以由单个列或者多个列组成。还是重新创建一个 student 表,通过PRIVARY KEY(列名1,列名2...)来指定主键,多个列组成的主键称作 复合主键

复合主键中的每一列不能同时相等

主键或唯一键冲突时的更新操作,插入否则更新

语法:

INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...

可以看到这里的更新操作针对两行进行了操作,删除了原来的行,又新增了一条记录。如果主键没有冲突则新增一条直接记录。

在实际开发中不建议直接替换老数据:

  1. 先按条件查询一下数据,有没有相应的记录
  2. 没有的话就 insert 一条新记录
  3. 有的话,要么做 update 操作,要么把原数据的删除标识置为已删除,再写一条新数据

2.5 FOREIFN KEY 外键约束

外键用于定义主表和从表之间的关系

外键约束定义在从表的列上,主表关联的列必须是主键或唯一约束

当定义外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为 null

主要作用:

  1. 确保引用完整:防止从表引用不存在的主表记录,确保数据逻辑关系正确;
  2. 维护数据一致:当主表数据变更时,数据库可以自动处理子表相关数据;
  3. 防止孤立记录:会阻止删除被引用的主表记录,避免子表记录因主表删除或修改导致变成“孤立记录”;
  4. 优化查询性能:这样的设计方法可以减少许多不必要数据的冗余。

语法:

foreign key (class_id) references class (id)

实例:

创建一个班级表 class , id 为主键

创建一个学生表,一个学生对应一个班级,一个班级对应多个学生,用 id 为主键,class_id 为外键,关联表 id

再在表中插入数据

当我们插入引用不存在的数据或是对主表中数据进行删除时

数据库都会进行报错:不能删除这一行,有一个外键约束

如果希望实现当主表修改时,从表自动更新,需要在约定外键时,补充  ON DELETE CASCADE

 FOREIGN KEY 外键 REFERENCES 主键 ON DELETE CASCADE

如果外键约束的特性,删改一定要先删除从表中的数据,导致在实际工作中一般不使用,可以通过在 JAVA 层面处理关联关系,保证数据正确后再入库

2.6 CHECK 约束

引用于一个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性

这里创建了一个 teacher 表,同时对表中的 gender 做了约束,规定只能为 男 或者 女

当我们使用规定之外的词就会进行报错,约束之内就可以正常输入

列与列直接也可以比较,需要在单独一行定义

示例:

CREATE TABLE t_check (c1 int check(c1 <> 0),c2 int check(c2 > 0),c3 int,check(c3 >= c2)
);

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

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

相关文章

【.net core】【watercloud】树形组件combotree导入及调用

源码下载:combotree: 基于layui及zTree的树下拉框组件 链接中提供了组件的基本使用方法 框架修改内容 1.文件导入&#xff08;路径可更具自身情况自行设定&#xff09; 解压后将文件夹放在图示路径下&#xff0c;修改文件夹名称为combotree 2.设置路径&#xff08;设置layu…

ES101系列07 | 分布式系统和分页

本篇文章主要讲解 ElasticSearch 中分布式系统的概念&#xff0c;包括节点、分片和并发控制等&#xff0c;同时还会提到分页遍历和深度遍历问题的解决方案。 节点 节点是一个 ElasticSearch 示例 其本质就是一个 Java 进程一个机器上可以运行多个示例但生产环境推荐只运行一个…

CppCon 2015 学习:3D Face Tracking and Reconstruction using Modern C++

1. 3D面部追踪和重建是什么&#xff1f; 3D面部追踪&#xff08;3D Face Tracking&#xff09;&#xff1a; 实时检测并追踪人脸在三维空间中的位置和姿态&#xff08;如转头、点头、表情变化等&#xff09;&#xff0c;通常基于摄像头捕获的视频帧。3D面部重建&#xff08;3D…

代码中的问题及解决方法

目录 YOLOX1. AttributeError: VOCDetection object has no attribute cache2. ValueError: operands could not be broadcast together with shapes (8,5) (0,)3. windows远程查看服务器的tensorboard4. AttributeError: int object has no attribute numel YOLOX 1. Attribu…

【JVM】Java类加载机制

【JVM】Java类加载机制 什么是类加载&#xff1f; 在 Java 的世界里&#xff0c;每一个类或接口在经过编译后&#xff0c;都会生成对应的 .class 字节码文件。 所谓类加载机制&#xff0c;就是 JVM 将这些 .class 文件中的二进制数据加载到内存中&#xff0c;并对其进行校验…

vue的监听属性watch的详解

文章目录 1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景 1. 监听属性 watch watch 是一个对象&#xff0c;键是需要观察的表达式&#xff0c;用于观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。回调函数的参数是新值和旧值。值也可以是方法名&am…

如何在 Ubuntu 24.04 服务器上安装 Apache Solr

Apache Solr 是一个免费、开源的搜索平台&#xff0c;广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。 Solr 基于 Java 开发&#xff0c;提供了分布式索引、复制、负载均衡及自动故障转移和恢复等功能。 本教程将指导您如何在 Ubuntu 24.…

Linux内核中TCP三次握手的实现机制详解

TCP三次握手是建立可靠网络连接的核心过程,其在内核中的实现涉及复杂的协议栈协作。本文将深入分析Linux内核中三次握手的实现机制,涵盖客户端与服务端的分工、关键函数调用、协议号验证及数据包处理流程。 一、三次握手的整体流程 三次握手分为三个阶段,客户端与服务端通过…

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…

优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷

引言 在构建需要处理和传输大量数据的API服务时&#xff0c;响应时间是一个关键的性能指标。一个常见的场景是&#xff0c;即使后端逻辑和数据库查询已得到充分优化&#xff0c;当API端点返回大型数据集&#xff08;例如&#xff0c;数千条记录的列表&#xff09;时&#xff0…

【WPF】WPF 项目实战:构建一个可增删、排序的光源类型管理界面(含源码)

&#x1f4a1;WPF 项目实战&#xff1a;构建一个可增删、排序的光源类型管理界面&#xff08;含源码&#xff09; 在实际的图像处理项目中&#xff0c;我们经常需要对“光源类型”进行筛选或管理。今天我们来一步步构建一个实用的 WPF 界面&#xff0c;实现以下功能&#xff1…

C++23 已弃用特性

文章目录 1. std::aligned_storage 与 std::aligned_union1.1 特性介绍1.2 被弃用的原因1.3 替代方案 2. std::numeric_limits::has_denorm2.1 特性介绍2.2 被弃用的原因 3. 总结 C23 已弃用特性包括&#xff1a;std::aligned_storage、std::aligned_union 与 std::numeric_lim…

十三、【核心功能篇】测试计划管理:组织和编排测试用例

【核心功能篇】测试计划管理:组织和编排测试用例 前言准备工作第一部分:后端实现 (Django)1. 定义 `TestPlan` 模型2. 生成并应用数据库迁移3. 创建 `TestPlanSerializer`4. 创建 `TestPlanViewSet`5. 注册路由6. 注册到 Django Admin第二部分:前端实现 (Vue3)1. 创建 `Test…

STM32最小CLion开发环境

文章目录 1 必须文件2 工具链3 CLion 全局配置4 CLion 新项目配置ST-Link 调试 5 点亮 LED6 分析 elf 文件7 项目模板 1 必须文件 ST 提供的头文件支持 MDK-ARM, GCC, IAR 3种编译器, 下面采用 GCC 编译器 Arm GNU Toolchain Downloads – Arm Developer 或 安装包版 调试器服…

核函数:解锁支持向量机的强大能力

在机器学习的世界中&#xff0c;支持向量机&#xff08;SVM&#xff09;是一种强大的分类算法&#xff0c;而核函数则是其背后的“魔法”&#xff0c;让 SVM 能够处理复杂的非线性问题。今天&#xff0c;我们就来深入探讨核函数的奥秘&#xff0c;看看它们是如何帮助 SVM 在高维…

【Go-6】数据结构与集合

6. 数据结构与集合 数据结构是编程中用于组织和存储数据的方式&#xff0c;直接影响程序的效率和性能。Go语言提供了多种内置的数据结构&#xff0c;如数组、切片、Map和结构体&#xff0c;支持不同类型的数据管理和操作。本章将详细介绍Go语言中的主要数据结构与集合&#xf…

3. 简述node.js特性与底层原理

&#x1f63a;&#x1f63a;&#x1f63a; 一、Node.js 底层原理&#xff08;简化版&#xff09; Node.js 是一个 基于 Chrome V8 引擎构建的 JavaScript 运行时&#xff0c;底层核心由几部分组成&#xff1a; 组成部分简要说明 1.V8 引擎 将 JS 编译成机器码执行&#xff0…

Web开发主流前后端框架总结

&#x1f5a5; 一、前端主流框架 前端框架的核心是提升用户界面开发效率&#xff0c;实现高交互性应用。当前三大主流框架各有侧重&#xff1a; React (Meta/Facebook) 核心特点&#xff1a;采用组件化架构与虚拟DOM技术&#xff08;减少真实DOM操作&#xff0c;优化渲染性能&…

大语言模型备案与深度合成算法备案的区别与联系

“什么情况下做算法备案&#xff1f;” “什么情况下做大模型备案呢&#xff1f;” 进行大模型备案的企业必然要进行算法备案&#xff0c;而进行算法备案的企业则需根据其提供的服务性质判断是否需要进行大模型备案。 算法备案与大模型备案已经是个老生常谈的话题了&#xf…

微软PowerBI考试 PL300-Power BI 入门

Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南&#xff0c;今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案&#xff0c;通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…