数据库---Day6 数据库约束

news2026/4/8 19:21:41
本系列可作为数据库学习系列的笔记文中提到的一些练习的代码小编会将代码复制下来大家复制下来就可以练习了方便大家学习。点赞关注不迷路您的点赞、关注和收藏是对小编最大的支持和鼓励系列文章目录JAVA初阶---------已更完JAVA数据结构---------已更完数据库---Day 1 数据库基础数据库---Day2 数据库操作数据库---Day3 数据类型数据库---Day4 数据表的操作数据库---Day5 数据表的增删改查数据库---Day6 数据库约束数据库---Day7 数据表设计目录目录系列文章目录目录前言0. 本节学习目标1. 什么是数据库约束2. 六大约束类型总览完整版对照表3. NOT NULL 非空约束超详细3.1 作用3.2 无约束时的问题数据不完整3.3 添加非空约束3.4 插入 NULL 报错3.5 正常插入3.6 查看非空约束4. DEFAULT 默认约束超详细4.1 作用4.2 无默认约束时4.3 添加默认约束4.4 不指定 age → 自动用默认值4.5 手动赋 NULL → 依然是 NULL4.6 查看默认约束5. UNIQUE 唯一约束超详细5.1 作用5.2 无唯一约束 → 可重复5.3 添加唯一约束5.4 插入重复值 → 报错5.5 查看唯一约束6. PRIMARY KEY 主键约束最重点6.1 主键是什么6.2 主键三大规则6.3 单列主键最常用6.4 主键 自增 AUTO_INCREMENT6.5 自增主键插入6.6 自增细节6.7 主键冲突处理高级用法6.7.1 存在则更新ON DUPLICATE KEY UPDATE6.7.2 存在则替换REPLACE6.8 复合主键多列联合7. FOREIGN KEY 外键约束表关系核心7.1 外键作用7.2 核心概念7.3 步骤 1创建主表班级7.4 步骤 2创建从表学生 外键7.5 查看外键7.6 外键约束规则必背7.7 插入不存在的班级 → 报错7.8 删除被引用班级 → 报错7.9 删除表顺序8. CHECK 约束自定义数据规则8.1 说明8.2 学生表 CHECK 示例8.3 违反 CHECK → 报错8.4 跨列比较 CHECK9. 全套约束高频面试题背会稳过10. 全文总结极简记忆版总结前言小编作为新晋码农一枚会定期整理一些写的比较好的代码作为自己的学习笔记会试着做一下批注和补充如转载或者参考他人文献会标明出处非商用如有侵权会删改欢迎大家斧正和讨论0. 本节学习目标掌握约束的使用场景掌握以下 6 种约束的创建与使用NOT NULL 非空约束DEFAULT 默认约束UNIQUE 唯一约束PRIMARY KEY 主键约束FOREIGN KEY 外键约束CHECK 约束1. 什么是数据库约束数据库约束对数据库表中的数据施加的强制规则 / 条件。作用确保数据准确、可靠、完整、一致从数据库层面拦截非法数据。数据库约束是数据库的一个重要功能主要作用是保证数据的完整性也可能理解数据的正确性数据本身是否正确关联关系是否正确。人工检查数据完整性的工作量非常大在数据表中定义一些约束那么数据库写入数据的时候数据库会帮我们做校验工作。约束一般是指定在列上的约束可以基于数据是否为空值是否唯一默认值关联关系自定义值范围一句话约束 数据库的守门员。2. 六大约束类型总览完整版对照表约束名称关键字核心作用特点非空约束NOT NULL列不能存储 NULL保证关键字段必须有值默认约束DEFAULT未赋值时自动填充默认值手动写 NULL 仍为 NULL唯一约束UNIQUE列值不能重复允许多个 NULL主键约束PRIMARY KEY唯一标识表中每一行非空 唯一一张表只能一个外键约束FOREIGN KEY建立两表关联关系保证引用完整性CHECK 约束CHECK限制值的范围 / 规则MySQL 8.0.16 真正生效3. NOT NULL 非空约束超详细3.1 作用指定列不允许为 NULL保证数据完整性。例如学生姓名、用户名、手机号不应该为 NULL。没有指定非空约束时当前的列是可以写入一个NULL值的如果要把某一列定义为一个必填项那么就可以使用not null非空约束。3.2 无约束时的问题数据不完整DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT, name VARCHAR(20) ); -- 可以插入 NULL数据无意义 INSERT INTO student VALUES (1, NULL); SELECT * FROM student; -- 结果name 为 NULL记录不完整NO 表示当前列不能为空 YES表示当前列可以为空。如果此时插入数据时id为空会显示报错提示不能写入null值数据库帮我们做了一次校验。insert into student values (NULL,张三);当我们的id修改后可以正常插入。3.3 添加非空约束DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL -- 非空约束 );3.4 插入 NULL 报错INSERT INTO student VALUES (1, NULL);报错信息ERROR 1048 (23000): Column name cannot be null3.5 正常插入INSERT INTO student VALUES (1, 张三);3.6 查看非空约束DESC student;查看规则Null列显示NO→ 不允许 NULLNull列显示YES→ 允许 NULL4. DEFAULT 默认约束超详细4.1 作用插入数据时没有给列赋值自动使用默认值。注意手动明确写 NULL依然是 NULL。4.2 无默认约束时DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT ); INSERT INTO student(id, name) VALUES (1, 张三); -- age 为 NULL4.3 添加默认约束DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18 -- 默认 18 岁 );4.4 不指定 age → 自动用默认值INSERT INTO student(id, name) VALUES (1, 张三); -- age 184.5 手动赋 NULL → 依然是 NULLINSERT INTO student(id, name, age) VALUES (2, 李四, NULL); -- age NULL4.6 查看默认约束DESC student;Default列会显示默认值。5. UNIQUE 唯一约束超详细5.1 作用列的值必须唯一不能重复。适用场景身份证号、学号、工号、手机号。5.2 无唯一约束 → 可重复DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) ); INSERT INTO student(id, name, sno) VALUES (1, 张三, 100001); INSERT INTO student(id, name, sno) VALUES (2, 李四, 100001); -- 重复学号依然成功5.3 添加唯一约束DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE -- 唯一约束 );5.4 插入重复值 → 报错INSERT INTO student(id, name, sno) VALUES (1, 张三, 100001); INSERT INTO student(id, name, sno) VALUES (2, 李四, 100001);报错ERROR 1062 (23000): Duplicate entry 100001 for key student.sno5.5 查看唯一约束DESC student;Key列显示UNI→ 唯一约束。6. PRIMARY KEY 主键约束最重点6.1 主键是什么主键 NOT NULL UNIQUE作用唯一标识表中的每一条记录。6.2 主键三大规则必须非空、唯一一张表只能有一个主键可以是单列或多列复合主键6.3 单列主键最常用DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT NOT NULL UNIQUE, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE );DESC student;→Key列显示PRI。6.4 主键 自增 AUTO_INCREMENT开发标准写法DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT PRIMARY KEY AUTO_INCREMENT, -- 自增主键 name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE );6.5 自增主键插入表示在当前表中上一条记录的基础上加1desc student; insert into student VALUES (NULL,张三,18,2020060845); insert into student VALUES (NULL,李四,18,2020060846); SELECT * from student;让数据库帮我们维护主键的增长不用程序员自己去计算了在插入的时候先找到最大的值然后在这个基础上加1生成一个新的值做为新一个数据行主键id列的值当设置了自增主键是发现了写入null时也可以成功的插入数据这里并不是说把这个NULL写入数据库了而是说让数据库帮我们处理这个键的值。当id值指定为100也是可以的只要主键值不重复即可。当再次插入时找到ID最大的值是1001所以下一个值是101.6.6 自增细节插入失败自增值会作废不回滚手动指定大 id下次自增从最大值开始主键值可以不连续6.7 主键冲突处理高级用法6.7.1 存在则更新ON DUPLICATE KEY UPDATEINSERT INTO student(id,name,sno) VALUES (100,赵六,100100) ON DUPLICATE KEY UPDATE name赵六, sno100100;6.7.2 存在则替换REPLACEREPLACE INTO student(id,name,sno) VALUES (101,钱七,100101);6.8 复合主键多列联合DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT, name VARCHAR(20), PRIMARY KEY (id, name) -- 联合主键 );规则两列组合不能重复。一个表中不允许有两个主键一个主键可包含多个列符合主键此时KEY列中出现了两个PRI表示当前表定义了复合主键在唯一校验时只有复合主键中所有的列都相同才被判定为相同。编号相同但是名字不同也可以插入。7. FOREIGN KEY 外键约束表关系核心7.1 外键作用定义两个表之间的关联关系保证引用完整性。表中某个列的值必须是别一张表中的主键列或是唯一约束列的值也就是当前表中的值在另一张表中必须存在且满足主键或唯一约束。7.2 核心概念主表被引用的表如班级表 class从表使用外键的表如学生表 student外键列必须引用主表的主键或唯一键7.3 步骤 1创建主表班级DROP TABLE IF EXISTS class; CREATE TABLE class ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL ); INSERT INTO class(name) VALUES (java01),(java02),(java03),(C01),(C02);7.4 步骤 2创建从表学生 外键DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, class_id BIGINT, FOREIGN KEY (class_id) REFERENCES class(id) -- 外键 );7.5 查看外键DESC student;Key列显示MUL→ 外键。7.6 外键约束规则必背从表插入的class_id必须在主表存在否则失败外键可以为 NULL表示未分配主表记录被从表引用时不能删除删表必须先删从表再删主表7.7 插入不存在的班级 → 报错INSERT INTO student(name, class_id) VALUES (王五, 100);报错ERROR 1452 (23000): Cannot add or update a child row7.8 删除被引用班级 → 报错DELETE FROM class WHERE namejava01;7.9 删除表顺序DROP TABLE student; -- 先删从表 DROP TABLE class; -- 再删主表8. CHECK 约束自定义数据规则8.1 说明MySQL8.0.16 版本开始才真正支持低版本会忽略。作用自定义列的值范围、条件、规则。8.2 学生表 CHECK 示例DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, gender CHAR(1), CHECK (age 16), -- 年龄 ≥16 CHECK (gender IN (男,女)) -- 性别只能男/女 );8.3 违反 CHECK → 报错-- 年龄太小 INSERT INTO student(name,age,gender) VALUES (张三,15,男); -- 性别非法 INSERT INTO student(name,age,gender) VALUES (张三,17,1);报错ERROR 3819 (HY000): Check constraint violated8.4 跨列比较 CHECKCREATE TABLE t_check ( c1 INT CHECK(c1 0), c2 INT CHECK(c2 0), c3 INT, CHECK(c3 c2) -- 列之间比较 );9. 全套约束高频面试题背会稳过主键和唯一约束的区别主键非空唯一允许 NULL一张表只能一个主键可多个唯一自增主键不连续正常吗正常失败 / 回滚会占用自增值外键有什么用保证引用完整性防止脏数据MySQL 什么时候 CHECK 生效8.0.16 及以上默认约束和 NULL 的关系不赋值用默认手动写 NULL 还是 NULL复合主键是什么多列联合作为主键组合不可重复10. 全文总结极简记忆版NOT NULL不许为空DEFAULT不赋值用默认UNIQUE不许重复PRIMARY KEY非空 唯一表的唯一标识FOREIGN KEY表关联保证引用合法CHECK自定义规则8.0.16 生效所有约束都是为了一件事让数据库数据更干净、更可靠。总结以上就是今天要讲的内容本文简单记录了数据库学习内容仅作为一份简单的笔记使用大家根据注释理解您的点赞关注收藏就是对小编最大的鼓励

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…