Mysql--基础篇--约束(主键,外键,唯一,检查,枚举及复合约束等)

在MySQL中,约束(Constraints)是用于确保数据库中数据完整性和一致性的规则。通过定义约束,可以防止用户插入、更新或删除不符合特定条件的数据,从而保证数据的准确性和可靠性。MySQL支持多种类型的约束,每种约束都有其特定的作用和使用场景。

1、主键约束(Primary Key Constraint)

作用:

  • 唯一性:确保表中的每一行都有一个唯一的标识符。
  • 非空性:主键列不允许包含NULL值。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,  -- 主键,自动递增name VARCHAR(50) NOT NULL,age INT
);

解释:

  • id列是主键,确保每个员工都有一个唯一的标识符,并且该列不允许为NULL。
  • AUTO_INCREMENT:自动为每一行生成唯一的ID,通常用于主键列。

或者在创建表后添加主键:

ALTER TABLE table_name
ADD PRIMARY KEY (column1);

特点:

  • 每个表只能有一个主键。
  • 主键可以由单个列或多列组成(称为复合主键)。
  • 主键列上的值必须是唯一的且不能为空。

2、外键约束(Foreign Key Constraint)

作用:

  • 引用完整性:确保两个表之间的关系。外键列的值必须存在于另一个表的主键列中,或者为NULL。
  • 级联操作:可以通过外键定义级联操作(如删除或更新时自动影响相关记录)。

示例:

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,order_date DATE,FOREIGN KEY (customer_id) REFERENCES customers(id)
);

解释:

  • orders表中的customer_id列是外键,引用customers表中的id列。
  • 这意味着orders表中的customer_id必须是customers表中存在的id,或者为NULL。

或者在创建表后添加外键:

ALTER TABLE table_name
ADD FOREIGN KEY (column1) REFERENCES parent_table(parent_column);

级联操作:

  • ON DELETE CASCADE:当父表中的记录被删除时,子表中相关的记录也会自动删除。
  • ON UPDATE CASCADE:当父表中的主键值被更新时,子表中相关的外键值也会自动更新。
    注意:
    如果主表设置了外键,建表时没有指定级联操作。Mysql默认不允许删除或更新主表中的外键,会直接报出外键的错误提示。
    级联示例:
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,order_date DATE,FOREIGN KEY (customer_id) REFERENCES customers(id)ON DELETE CASCADEON UPDATE CASCADE
);

注意事项:

  • 外键列的数据类型必须与引用的主键列的数据类型兼容。
  • 外键约束会增加一定的性能开销,尤其是在大规模数据操作时。

3、唯一约束(Unique Constraint)

作用:

  • 唯一性:确保列中的所有值都是唯一的,但允许包含NULL值(多NULL值被视为不同的值)。

示例:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) UNIQUE, – 确保每个用户的电子邮件地址是唯一的,但可以为空
username VARCHAR(50)
);
解释:

  • email列上的唯一约束确保每个用户的电子邮件地址是唯一的。

或者在创建表后添加唯一约束:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1);

复合唯一约束:

  • 可以为多个列组合定义唯一约束,确保这些列的组合值是唯一的。
    示例:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),UNIQUE (first_name, last_name)  -- 确保第一名称和姓氏的组合是唯一的
);

注意事项:

  • 唯一约束允许NULL值,但多个NULL值被视为不同的值。
  • 如果需要确保某一列既唯一又不允许NULL,可以同时使用NOT NULL和UNIQUE约束。

4、非空约束(Not Null Constraint)

作用:

  • 强制非空:确保列中的值不能为空(即不允许NULL)。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,  -- 确保员工的名字不能为空age INT
);

解释:

  • name列上的NOT NULL约束确保每个员工的名字不能为空。

或者在创建表后修改列以添加非空约束:

ALTER TABLE table_name
MODIFY column1 datatype NOT NULL;

注意事项:

  • 非空约束不能与AUTO_INCREMENT一起使用,因为AUTO_INCREMENT会自动为列生成值。
  • 非空约束适用于所有数据类型,包括数值、字符串、日期等。

5、默认值约束(Default Constraint)

作用:

  • 设置默认值:当插入新记录时,如果没有为某列提供值,则自动使用指定的默认值。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT DEFAULT 18,  -- 如果没有提供年龄,默认为 18hire_date DATE DEFAULT CURRENT_DATE  -- 如果没有提供入职日期,默认为当前日期
);

解释:

  • age列上的默认值为18,如果插入新记录时未提供年龄,则自动使用18。
  • hire_date列上的默认值为CURRENT_DATE,表示当前日期。

或者在创建表后修改列以添加默认值:

ALTER TABLE table_name
ALTER COLUMN column1 SET DEFAULT default_value;

注意事项:

  • 默认值可以是常量、表达式或函数(如CURRENT_DATE)。
  • 默认值不会覆盖显式提供的值,只有在插入时未提供值时才会使用默认值。

6、检查约束(Check Constraint)

作用:

  • 数据验证:确保列中的值满足特定的条件或范围。只有符合条件的值才能插入或更新到该列中。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT CHECK (age >= 18 AND age <= 65),  -- 确保年龄在 1865 之间salary DECIMAL(10, 2) CHECK (salary > 0)  -- 确保工资大于 0
);

解释:

  • age列上的检查约束确保年龄在18到65之间。
  • salary列上的检查约束确保工资大于0。

或者在创建表后添加检查约束:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (condition);

注意事项:

  • 检查约束可以包含简单的条件(如 >=、<=、=)或更复杂的表达式。
  • 检查约束只适用于单个列,不能跨多个列进行复杂检查。
  • 在某些版本的MySQL中(如5.7及之前),检查约束虽然可以定义,但并不会实际执行。从MySQL 8.0.16开始,检查约束得到了完整的支持并会强制执行。

7、枚举约束(Enum Constraint)

作用:

  • 限制取值范围:枚举类型允许你为列定义一组固定的、预定义的值。插入或更新时,列的值必须是这些预定义值之一。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,status ENUM('active', 'inactive', 'on_leave') NOT NULL  -- 状态只能是 'active'、'inactive' 或'on_leave'
);

解释:

  • status列上的枚举约束确保状态只能是active、inactive或on_leave。

注意事项:

  • 枚举值是按定义顺序存储的,内部使用整数索引表示。例如,'active’对应索引1,‘inactive’ 对应索引2,依此类推。
  • 枚举类型适合用于有限的、固定的选择集,如性别、状态等。

8、集合约束(Set Constraint)

作用:

  • 多值选择:集合类型允许你为列定义一组固定的、预定义的值,并且该列可以存储多个值。每个值必须是这些预定义值之一。

示例:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,skills SET('Java', 'Python', 'C++', 'SQL') NOT NULL  -- 技能可以是多个值的组合
);

解释:

  • skills列上的集合约束允许存储多个技能,如’Java,Python’或’C++,SQL’。

注意事项:

  • 集合类型适合用于多选一或多选多的情况,如技能、权限等。
  • 集合值是按位存储的,内部使用位掩码表示。例如,'Java’对应位1,'Python’对应位2,依此类推。

9、复合约束

在MySQL中,可以为一个字段定义多个约束。

示例:

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(100) UNIQUE NOT NULL  -- 唯一 + 非空
);

解释: 唯一(Unique)+非空(NOT NULL)

  • 唯一约束:确保该字段中的所有值都是唯一的,但允许NULL值(多个NULL值被视为不同的值)。
  • 非空约束:确保该字段不允许NULL值。
    所以这两个叠加在一起约束,就起到了唯一且不允许为null的约束。

在MySQL中,可以为一个字段定义多个约束.
常见的组合包括:

  • 主键 + 非空
  • 唯一 + 非空
  • 外键 + 非空
  • 默认值 + 非空
  • 检查 + 非空
  • 枚举 + 非空
  • 集合 + 非空
  • 唯一 + 默认值
  • 外键 + 默认值
  • 唯一 + 检查
  • 外键 + 检查
    通过合理组合多个约束,你可以更精确地控制字段的值,确保数据的完整性和一致性。然而,需要注意的是,某些约束组合可能会相互影响,因此在设计表结构时应仔细考虑每个约束的作用和限制。
    所以通常不使用复合约束,除非必要场景。

10、总结

MySQL提供了多种类型的约束来确保数据的完整性和一致性。

适用场景:

  • 主键约束:确保每一行都有唯一的标识符。
  • 外键约束:维护表之间的引用完整性。
  • 唯一约束:确保列中的值是唯一的。
  • 非空约束:确保列中的值不能为空。
  • 默认值约束:为列提供默认值。
  • 检查约束:确保列中的值满足特定条件。
  • 枚举约束:限制列的取值范围为预定义的值。
  • 集合约束:允许列存储多个预定义的值。

通过合理使用这些约束,你可以有效地保护数据库中的数据,防止不合法的数据进入系统,从而提高数据的质量和可靠性。

乘风破浪会有时,直挂云帆济沧海!!!

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

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

相关文章

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴&#xff08;Event Storming&#xff09;事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

模拟SpringIOCAOP

一、IOC容器 Ioc负责创建&#xff0c;管理实例&#xff0c;向使用者提供实例&#xff0c;ioc就像一个工厂一样&#xff0c;称之为Bean工厂 1.1 Bean工厂的作用 先分析一下Bean工厂应具备的行为 1、需要一个获取实例的方法&#xff0c;根据一个参数获取对应的实例 getBean(…

科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍特点意义加载R包数据下载导入数据数据预处理画图输出总结系统信息介绍 Y轴截断分组柱状图是一种特殊的柱状图,其特点是Y轴的刻度被截断,即在某个范围内省略了部分刻度。这种图表…

django基于 Python 的考研学习系统的设计与实现

以下是对Django基于Python的考研学习系统的设计与实现&#xff1a; 一、系统概述 Django基于Python的考研学习系统是一个为考研学子提供一站式学习辅助的平台。它整合了丰富的学习资源、学习计划制定、学习进度跟踪以及交流互动等功能&#xff0c;旨在满足考生在备考过程中的…

C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序

1 图的广度优先遍历 图的广度优先遍历&#xff08;或搜索&#xff09;类似于树的广度优先遍历&#xff08;参见本文的方法2&#xff09;。这里唯一需要注意的是&#xff0c;与树不同&#xff0c;图可能包含循环&#xff0c;因此我们可能再次来到同一个节点。为了避免多次处理节…

Kafka 主题管理

主题作为消息的归类&#xff0c;分区则是对消息的二次归类。分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 分区的划分不仅为Kafka提供了可伸缩性、水平扩展的功能&#xff0c;还通过多副本机制来为Kafka提供数据冗余以提高可靠性。 图 主题、分区、副本和日…

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…

51c自动驾驶~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/13050104 #世界模型会是L3自动驾驶的唯一解吗 三维空间占有率&#xff08;3D Occupancy&#xff09;预测的目的是预测三维空间中的每个体素是否被占有&#xff0c;如果被占有&#xff0c;则对应的体素将被标记。3D Semant…

忘记了PDF文件的密码,怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…

fastapi 使用

参考&#xff1a; https://fastapi.tiangolo.com/zh/tutorial/first-steps/https://fastapi.tiangolo.com/zh/tutorial/first-steps/ FastAPI 用于基于标准 Python 类型提示使用 Python 构建 API&#xff0c;使用 ASGI 的标准来构建 Python Web 框架和服务器。所有简单理解&a…

单片机(MCU)-简单认识

简介&#xff1a; 内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;&#xff0c;处理&#xff08;依靠CPU&#xff09;&…

解决el-table表格数据量过大导致页面卡顿问题 又名《umy-ui---虚拟表格仅渲染可视区域dom的神》

后台管理系统的某个页面需要展示多个列表 数据量过多 页面渲染dom卡顿 经调研发现两个组件 pl-table和umy-ui &#xff08;也就是u-table&#xff09; 最终决定使用umy-ui 它是专门基于 Vue 2.0 的桌面端组件库 流畅渲染表格万级数据 而且他是对element-ui的表格做了二次优化…

提升租赁效率的租赁小程序全解析

内容概要 在如今快节奏的生活中&#xff0c;租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业&#xff0c;都会因其便捷的功能而受益。简单来说&#xff0c;租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里&#xff0c;我们将带您畅游租赁小程序的海洋&a…

【2024年华为OD机试】(C卷,100分)- 输出指定字母在字符串的中的索引(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个字符串&#xff0c;把字符串按照大写在前小写在后排序&#xff0c;输出排好后的第 K 个字母在原来字符串的索引。相同字母输出第一个出现的位置。 输入描述 无 输出描述 无 用例 用例 1 输入: hAkDAjByBq 4输出: 6说明: 排好序后 AAB…

Vue sm3国密 IE模式报错处理

1、sm-crypto 转义错误 查看报错信息包名 在vue.config.js的transpileDependencies中把依赖包添加进去&#xff0c;让babel能够转译sm-crypto包 babel.config.js module.exports {presets: [[vue/app, {useBuiltIns: entry}]] }2、exports.destroy (() &#xff1e; { … }&a…

超燃预告!Origin百图绘制系列即将登场

Hello&#xff0c;大家好 这里是练习时长两年半的菜狗~ 持续更新各种竞赛&#xff0c;科研&#xff0c;保研&#xff0c;学习干货ing 回想刚开始打比赛那会&#xff0c;啥都不懂&#xff0c;就从用 Excel 画图起步&#xff0c;绘制的图形实在太难看。后来运用 Matlab&#xf…

burpsiute的基础使用(2)

爆破模块&#xff08;intruder&#xff09;&#xff1a; csrf请求伪造访问&#xff08;模拟攻击&#xff09;: 方法一&#xff1a; 通过burp将修改&#xff0c;删除等行为的数据包压缩成一个可访问链接&#xff0c;通过本地浏览器访问&#xff08;该浏览器用户处于登陆状态&a…

【日常小记】Ubuntu启动后无图形界面且网络配置消失

【日常小记】Ubuntu启动后无图形界面且网络配置消失 解决方法&#xff1a; 1. 输入后恢复网络: #sudo dhclient 2. 重新安装ubuntu-desktop #sudo apt-get install ubuntu-desktop&#xff01;&#xff01;&#xff01;请关注是否能ping通某网站&#xff08;例如百度&…

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

010:传统计算机视觉之大津算法初探

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节学习了利用 Canny 算法来完成一个图片的边缘检测&#xff0c;从而可以区分出图像的边缘。 本节再了解一个计算机视觉中更常见的应用&#xff0c;那就是把图片的前景和…