mysql学习教程,从入门到精通,SQL 约束(Constraints)(41)
在数据库设计中,约束(Constraints)用于确保数据的准确性和完整性。它们通过限制可以插入到数据库表中的数据类型来防止无效数据。SQL 中有几种常见的约束类型,包括主键约束(Primary Key)、外键约束(Foreign Key)、唯一约束(Unique)、非空约束(NOT NULL)和检查约束(CHECK)。下面是一篇关于 SQL 约束的详细介绍:
1、SQL 约束(Constraints)
在关系型数据库中,约束是维护数据完整性和一致性的重要机制。约束可以应用于数据库表中的列或表本身,确保数据在插入、更新或删除时满足特定的规则。本文将介绍几种常见的 SQL 约束类型及其用法。
1.1. 主键约束(Primary Key)
主键约束用于唯一标识表中的每一行。主键列不能包含 NULL 值,并且表中的每一行都必须有唯一的主键值。主键可以由一列或多列组成(复合主键)。
CREATE TABLE Students (StudentID INT PRIMARY KEY,FirstName VARCHAR(50),LastName VARCHAR(50),DateOfBirth DATE
);
在上面的例子中,StudentID
列被定义为主键。
1.2. 外键约束(Foreign Key)
外键约束用于在两个表之间建立连接,确保表中的数据具有参照完整性。外键列中的每个值都必须在被引用的表的主键或唯一键中存在。
CREATE TABLE Courses (CourseID INT PRIMARY KEY,CourseName VARCHAR(100)
);CREATE TABLE Enrollments (EnrollmentID INT PRIMARY KEY,StudentID INT,CourseID INT,FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
在这个例子中,Enrollments
表中的 CourseID
列是外键,它引用了 Courses
表中的 CourseID
列。
1.3. 唯一约束(Unique)
唯一约束确保表中的一列或多列的值是唯一的。与主键不同,唯一约束允许 NULL 值,但每个 NULL 值也被视为不同的值。
CREATE TABLE Users (UserID INT PRIMARY KEY,Email VARCHAR(100) UNIQUE,Username VARCHAR(50)
);
在这个例子中,Email
列被定义为唯一约束,确保每个电子邮件地址在表中是唯一的。
1.4. 非空约束(NOT NULL)
非空约束确保列不能包含 NULL 值。它用于确保数据列的完整性,防止遗漏关键信息。
CREATE TABLE Products (ProductID INT PRIMARY KEY,ProductName VARCHAR(100) NOT NULL,Price DECIMAL(10, 2) NOT NULL
);
在这个例子中,ProductName
和 Price
列被定义为非空约束,确保在插入新记录时这些列必须有值。
1.5. 检查约束(CHECK)
检查约束用于确保列中的值满足特定的条件。它允许定义更复杂的规则,以确保数据的有效性。
CREATE TABLE Orders (OrderID INT PRIMARY KEY,OrderDate DATE,Status VARCHAR(20),CHECK (Status IN ('Pending', 'Shipped', 'Delivered', 'Cancelled'))
);
在这个例子中,Status
列被定义为检查约束,确保列中的值只能是 'Pending'
、'Shipped'
、'Delivered'
或 'Cancelled'
中的一个。
1.6.结论
SQL 约束是确保数据库数据完整性和一致性的关键工具。通过合理应用主键、外键、唯一、非空和检查约束,可以显著提高数据的质量,防止无效数据的插入。了解和应用这些约束对于设计高效、可靠的数据库系统至关重要。
当然,下面我将提供一个具体的 SQL 约束的例子,这个例子将涵盖几种常见的约束类型,并展示如何在创建表时应用它们。
SQL 约束例子
假设我们正在设计一个简单的学生成绩管理系统,其中包含两个表:Students
(学生表)和 Grades
(成绩表)。
1. 创建 Students
表
首先,我们创建 Students
表,其中包含学生的基本信息。我们将应用主键约束、唯一约束和非空约束。
CREATE TABLE Students (StudentID INT PRIMARY KEY, -- 主键约束,确保每个学生有一个唯一的IDFirstName VARCHAR(50) NOT NULL, -- 非空约束,确保名字不为空LastName VARCHAR(50) NOT NULL, -- 非空约束,确保姓氏不为空Email VARCHAR(100) UNIQUE, -- 唯一约束,确保每个电子邮件地址是唯一的DateOfBirth DATE -- 日期字段,无约束(可以为空)
);
2. 创建 Grades
表
接下来,我们创建 Grades
表,用于存储学生的成绩信息。我们将应用主键约束、外键约束和非空约束,并添加一个检查约束来确保成绩在有效范围内。
CREATE TABLE Grades (GradeID INT PRIMARY KEY, -- 主键约束,确保每条成绩记录有一个唯一的IDStudentID INT, -- 学生ID,外键约束将引用Students表CourseName VARCHAR(100) NOT NULL, -- 课程名称,非空约束Grade DECIMAL(5, 2) CHECK (Grade BETWEEN 0 AND 100), -- 成绩字段,检查约束确保成绩在0到100之间FOREIGN KEY (StudentID) REFERENCES Students(StudentID) -- 外键约束,确保StudentID在Students表中存在
);
3. 插入数据示例
现在我们可以向这两个表中插入一些数据来验证约束是否有效。
-- 插入学生数据
INSERT INTO Students (StudentID, FirstName, LastName, Email, DateOfBirth)
VALUES
(1, 'John', 'Doe', 'john.doe@example.com', '2000-01-15'),
(2, 'Jane', 'Smith', 'jane.smith@example.com', '1999-07-22');-- 尝试插入一个重复的电子邮件地址(这将失败,因为Email列有唯一约束)
-- INSERT INTO Students (StudentID, FirstName, LastName, Email, DateOfBirth)
-- VALUES
-- (3, 'Alice', 'Johnson', 'john.doe@example.com', '2001-03-30');-- 插入成绩数据
INSERT INTO Grades (GradeID, StudentID, CourseName, Grade)
VALUES
(1, 1, 'Mathematics', 85.5),
(2, 2, 'Science', 92.0),
(3, 1, 'History', 78.0);-- 尝试插入一个超出范围的成绩(这将失败,因为Grade列有检查约束)
-- INSERT INTO Grades (GradeID, StudentID, CourseName, Grade)
-- VALUES
-- (4, 2, 'Art', 120.0);
结论
在这个例子中,我们展示了如何在创建表时应用不同类型的 SQL 约束来确保数据的完整性和准确性。主键约束确保了表中每条记录的唯一性;外键约束维护了表之间的关系;唯一约束确保了特定列中的值不重复;非空约束确保了列中不会有缺失的数据;检查约束则允许我们定义更复杂的规则来验证数据的有效性。
通过这些约束,我们可以防止无效数据的插入,从而确保数据库中的数据是可靠和准确的。
相关文章:
mysql学习教程,从入门到精通,SQL 约束(Constraints)(41)
在数据库设计中,约束(Constraints)用于确保数据的准确性和完整性。它们通过限制可以插入到数据库表中的数据类型来防止无效数据。SQL 中有几种常见的约束类型,包括主键约束(Primary Key)、外键约束…...
使用CSS3与JavaScript实现炫酷的3D旋转魔方及九宫格交换动效
文章目录 前言一、项目需求背景二、CSS3 3D基础知识介绍2.1 什么是CSS3 3D?2.2 主要使用的CSS属性 三、使用HTML和CSS搭建魔方结构四、让魔方动起来:CSS3动画五、九宫格数字交换的JavaScript实现5.1 九宫格布局5.2 随机交换数字 六、随机交换与相邻格子的…...

springboot项目通过maven的profile功能实现通过不同文件夹的方式来组织不同环境配置文件
写在前面 本文看下springboot项目如何通过文件夹的方式来组织不同环境配置文件。 1:正文 一般的我们写springboot项目时配置文件是这个样子的: appliction.yaml --> 通过spring.profiles.activexxx来激活某个指定后缀的配置文件 application-evn1…...

GAN(Generative Adversarial Nets)
GAN(Generative Adversarial Nets) 引言 GAN由Ian J. Goodfellow等人提出,是Ian J. Goodfellow的代表作之一,他还出版了大家耳熟能详的花书(Deep Learning深度学习),GAN主要的思想是同时训练两个模型,生成…...

linux下使用mpi求自然数和
搭建MPI并行计算环境,编写 MPI程序,求和 1 23....1 0000。 要求: 1.使用100个进程; 2.进程0计算1 2...100, 进程1计算101 102... 200, ..... 进程99计算9901 9902... 10000; 3.调用计时函数,分别输出每个进程的计算时间; 4.需使用MPI集群通信函数和同…...

WebGl学习使用attribute变量绘制一个水平移动的点
在WebGL编程中,attribute变量是一种特殊类型的变量,用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等,它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明,并且对于每个顶点来说都…...
机器学习四大框架详解及实战应用:PyTorch、TensorFlow、Keras、Scikit-learn
目录 框架概述PyTorch:灵活性与研究首选TensorFlow:谷歌加持的强大生态系统Keras:简洁明了的高层 APIScikit-learn:传统机器学习的必备工具实战案例 图像分类实战自然语言处理实战回归问题实战 各框架的对比总结选择合适的框架 1…...

linux源码安装slurm以及mung和openssl
一、源码安装munge 1、编译安装munge (1)下载munge地址:https://github.com/dun/munge/releases (2)解压编译安装: 1 2 3 4 5 6 7 8 创建/data目录 复制文件munge-0.5.15.tar.xz 到/data目录下 tar -Jx…...
分享蓝牙耳机A2DP音频卡顿原因及解决思路
背景 最近一直在更新博客,我觉得写博客有三个好处,一是很多东西时间久了就会忘,记下来方便自己以后回忆和总结,二是记下来可以加深自己对知识的理解,三是可以知识分享,方便他人。 言归正传,今天…...

Mac 下编译 libaom 源码教程
AV1 AV1是一种开放、免版税的视频编码格式,由开放媒体联盟(AOMedia)开发,旨在提供高压缩效率和优秀的视频质量。AV1支持多种分辨率,包括SD、HD、4K和8K,并适用于视频点播(VOD)、直播…...

【成品设计】基于Arduino平台的物联网智能灯
《基于Arduino平台的物联网智能灯》 整体功能: 这个任务中要求实现一个物联网智能灯。实际测试环境中要求设备能够自己创建一个热点,连接这个热点后能自动弹出控制界面(强制门户)。 功能点 基础功能 (60分) 要求作品至少有2个灯…...

安装和配置k8s可视化UI界面dashboard-1.20.6
安装和配置k8s可视化UI界面dashboard-1.20.6 1.环境规划2.初始化服务器1)配置主机名2)设置IP为静态IP3)关闭selinux4)配置主机hosts文件5)配置服务器之间免密登录6)关闭交换分区swap,提升性能7&…...

VLAN:虚拟局域网
VLAN:虚拟局域网 交换机和路由器协同工作后,将原先的一个广播域,逻辑上,切分为多个广播域。 第一步:创建VLAN [SW1]dispaly vlan 查询vlan VID(VLAN ID):用来区分和标定不同的vlan 由12位二进制构成 范围: 0-4…...

利用可解释性技术增强制造质量预测模型
概述 论文地址:https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习(ML)模型性能的方法。该方法已用于铣削质量预测,这一过程首先训练 ML 模型,然后使用可解释性技术识别不需要的特征并去…...

FlexMatch: Boosting Semi-Supervised Learning with Curriculum Pseudo Labeling
FlexMatch: Boosting Semi-Supervised Learning with Curriculum Pseudo Labeling 摘要:引言:背景3 flexMatch3.1 Curriculum Pseudo Labeling3.2 阈值预热3.3非线性映射函数实验4.1 主要结果4.2 ImageNet上的结果4.3收敛速度加速4.4 消融研究5 相关工作摘要: 最近提出的Fi…...

Spring Cloud 3.x 集成eureka快速入门Demo
1.什么是eureka? Eureka 由 Netflix 开发,是一种基于REST(Representational State Transfer)的服务,用于定位服务(服务注册与发现),以实现中间层服务的负载均衡和故障转移ÿ…...
线性代数 矩阵
一、矩阵基础 1、定义 一组数按照矩形排列而成的数表;形似行列式,区别点是 矩阵行列式符号()或[]| |形状方阵或非方阵方阵本质数表数属性A|A|是A诸多属性中的一种维度m *n (m 与n可以相等也可以不相等)n*n 同型矩阵 若A、B两个矩阵都是mn 矩阵&#x…...

【C语言】使用结构体实现位段
文章目录 一、什么是位段二、位段的内存分配1.位段内存分配规则练习1练习2 三、位段的跨平台问题四、位段的应用五、位段使用的注意事项 一、什么是位段 在上一节中我们讲解了结构体,而位段的声明和结构是类似的,它们有两个不同之处,如下&…...

univer实现excel协同
快速入门 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&q…...

JavaScript进阶笔记--深入对象-内置构造函数及案例
深入对象 创建对象三种方式 利用对象字面量new Object({…})利用构造函数 // 1. 字面量创建对象const obj1 {name: pig,age: 18};console.log(obj1); // {name: "pig", age: 18}// 2. 构造函数创建对象function Pig(name, age) {this.name…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...