当前位置: 首页 > article >正文

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

本系列可作为数据库学习系列的笔记文中提到的一些练习的代码小编会将代码复制下来大家复制下来就可以练习了方便大家学习。点赞关注不迷路您的点赞、关注和收藏是对小编最大的支持和鼓励系列文章目录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 生效所有约束都是为了一件事让数据库数据更干净、更可靠。总结以上就是今天要讲的内容本文简单记录了数据库学习内容仅作为一份简单的笔记使用大家根据注释理解您的点赞关注收藏就是对小编最大的鼓励

相关文章:

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

本系列可作为数据库学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励! 系列文章目…...

OpenClaw多通道实战:Qwen3-32B同时处理飞书与邮箱请求

OpenClaw多通道实战:Qwen3-32B同时处理飞书与邮箱请求 1. 为什么需要多通道自动化 上周五晚上11点,我正打算关电脑休息时,突然收到飞书消息:"明天上午10点临时会议需要准备材料"。与此同时,邮箱里又弹出客…...

UDOP-large保姆级教程:手把手教你提取英文论文标题与摘要

UDOP-large保姆级教程:手把手教你提取英文论文标题与摘要 1. 引言:为什么选择UDOP-large处理英文论文 作为一名经常需要阅读大量英文文献的研究人员,我深知从PDF论文中提取标题和摘要的繁琐。传统方法要么需要手动复制粘贴,要么…...

解决Open-AutoGLM部署难题:ADB连接、模型加载、内存不足全攻略

解决Open-AutoGLM部署难题:ADB连接、模型加载、内存不足全攻略 1. 项目简介与核心价值 Open-AutoGLM是智谱AI开源的手机端智能助理框架,它能通过自然语言指令自动操控安卓设备。想象一下,只需说"打开小红书搜美食",AI…...

灵感画廊实际作品:基于‘纪实瞬间’预设的城市街景写实图像生成

灵感画廊实际作品:基于‘纪实瞬间’预设的城市街景写实图像生成 “见微知著,凝光成影。将梦境的碎片,凝结为永恒的视觉诗篇。” 今天,我们不谈复杂的参数,也不讲枯燥的部署。我想带你走进一个特别的创作空间——灵感画…...

Pixel Aurora Engine效果对比:传统像素绘制 vs Pixel Aurora AI生成效率

Pixel Aurora Engine效果对比:传统像素绘制 vs Pixel Aurora AI生成效率 1. 两种创作方式的本质区别 1.1 传统像素绘制的工作流程 传统像素艺术创作是一个完全手动的过程,艺术家需要: 使用专业绘图软件(如Aseprite或Photoshop…...

MySQL主从复制、高可用集群架构详解

一、复制(Replication) MySQL Replication是官方提供的主从同步方案,也是用的最广的同步方案。Replication(复制)使来自一个 MySQL数据库服务器(称为源(Source))的数据能够复制到一个或多个 My…...

效果实测:EagleEye(DAMO-YOLO)在多种场景下的目标检测表现

效果实测:EagleEye(DAMO-YOLO)在多种场景下的目标检测表现 想了解一个号称“毫秒级”响应的目标检测模型,在实际使用中到底有多快、多准吗?今天,我们不谈复杂的部署步骤,也不讲深奥的技术原理,就单纯来看看…...

LLM强化学习从入门到精通:Composition-RL全解析,收藏这篇就够了!

🎯 为什么我们需要Composition-RL? 想象一下:你正在备考数学竞赛,一开始做的都是基础题。随着练习增多,你能轻松答对所有基础题,但这些简单题已经无法帮你进步了——你需要更难的题目来提升能力。 这正是…...

医生Agent实战教程(非常详细),别再瞎喂数据看这篇就够了!

如果把近两年的大模型发展比作“加速跑”,那么这篇论文的开场就像直接指出:跑道快到头了。作者认为,当前大语言模型的扩展规律正遭遇一个越来越现实的瓶颈: 高质量人类语料接近枯竭,模型继续“吃数据”变得困难,这被他…...

开发者必备:OpenClaw调试Phi-3-mini-128k-instruct接口的3个关键技巧

开发者必备:OpenClaw调试Phi-3-mini-128k-instruct接口的3个关键技巧 1. 为什么需要专门调试Phi-3-mini接口? 上周我在尝试用OpenClaw对接Phi-3-mini-128k-instruct模型时,遇到了一个典型问题:明明本地curl测试接口返回正常&…...

Free RTOS:任务状态,任务管理与调度理论

目录 1.任务状态 1.1 FreeRTOS的任务状态: 1.2 阻塞状态(Blocked) 1.3 暂停状态(Suspended) 原型如下: 1.4 就绪状态(Ready) 1.5 完整的状态转换图 1.6 代码 2.任务管理与调度理论 2.1 调度 2.2 FreeRTOS调度 STM32CubeMX FreeRTOS源码 代…...

FLUX.小红书极致真实V2效果展示:宠物毛发层次、眼睛高光、微表情刻画

FLUX.小红书极致真实V2效果展示:宠物毛发层次、眼睛高光、微表情刻画 想不想拥有一款能生成媲美专业摄影棚照片的AI工具?今天要展示的,就是这样一个“神器”——基于FLUX.1-dev模型和小红书极致真实V2 LoRA打造的本地图像生成工具。它最大的…...

PyCharm与Anaconda环境管理详解:Phi-3-mini-4k-instruct-gguf解决Python包冲突

PyCharm与Anaconda环境管理详解:Phi-3-mini-4k-instruct-gguf解决Python包冲突 1. 为什么需要环境管理工具 Python开发中最让人头疼的问题之一就是包冲突。你可能遇到过这种情况:昨天还能运行的代码,今天突然报错;或者在一个项目…...

互联网产品创新:基于MogFace-large的社交平台智能相册分类功能

互联网产品创新:基于MogFace-large的社交平台智能相册分类功能 你是不是也有过这样的烦恼?手机相册里存了几千甚至上万张照片,想找一张和某个朋友的合影,却要像大海捞针一样翻上半天。聚会、旅行、日常随手拍,照片越积…...

RWKV7-1.5B-g1a开源大模型入门指南:低显存(3.8GB)轻量文本生成实操

RWKV7-1.5B-g1a开源大模型入门指南:低显存(3.8GB)轻量文本生成实操 1. 模型简介 rwkv7-1.5B-g1a 是一款基于RWKV-7架构的开源文本生成模型,专为轻量级应用场景设计。这个1.5B参数的模型在多语言文本生成任务上表现出色&#xff…...

SecGPT-14B模型微调:OpenClaw自动化准备标注数据与训练脚本

SecGPT-14B模型微调:OpenClaw自动化准备标注数据与训练脚本 1. 为什么需要自动化微调流程 当我第一次尝试微调SecGPT-14B模型时,最让我头疼的不是模型本身,而是那些繁琐的前期准备工作。作为安全领域的从业者,我深知专业数据的价…...

Facebook广告细分定位新功能解析

Facebook广告细分定位新功能的本质,是广告受众定位正式进入了“自然语言”时代。简单来说,就是把过去从庞大的标签库里找词,变成了直接用日常语言描述你想要触达的目标人群。这背后,是Meta全新的 “Andromeda”(仙女座…...

zRenamer 1.9 批量重命名工具

一、软件背景 1. 核心痛点来源 日常文件管理中,用户长期面临批量重命名低效、混乱、易出错的核心痛点: 手动操作繁琐:零散文件(照片、文档、视频)命名无规则,手动修改数百个文件耗时极长,重复…...

nli-distilroberta-base生产环境:低延迟NLI服务在搜索Query改写中应用

nli-distilroberta-base生产环境:低延迟NLI服务在搜索Query改写中应用 1. 项目概述 在搜索引擎优化和智能问答系统中,Query改写是一个关键环节。nli-distilroberta-base是一个基于DistilRoBERTa模型的轻量级自然语言推理(NLI)服务,专门为生…...

第二篇:KNX实战进阶|分模式开发+综合项目落地,手把手教你搞定

在上一篇博客中,我们已经掌握了KNX协议基础、开发环境搭建与协议栈移植,完成了“入门铺垫”。这一篇,我们将进入核心实战环节——聚焦KNX TP(楼宇主流)和KNX IP(远程控制)两种模式的开发&#x…...

VibeVoice语音合成系统效果展示:专业配音级语音频谱图分析

VibeVoice语音合成系统效果展示:专业配音级语音频谱图分析 1. 语音合成技术的新突破 你有没有想过,现在的AI语音合成已经能做到多逼真?不再是那种机械的、冰冷的机器人声音,而是真正像专业配音演员录制的高质量语音。VibeVoice语…...

第一篇:KNX入门实战|从协议基础到开发环境搭建,新手也能轻松上手

在智能楼宇与工业自动化领域,KNX协议绝对是绕不开的核心标准——作为全球通用的开放式楼宇控制协议(ISO/IEC 14543),它融合了欧洲三大总线协议的优势,能实现照明、空调、传感器等各类设备的无缝联动,广泛应…...

OpenClaw自动化测试新思路:千问3.5-27B生成与执行UI测试用例

OpenClaw自动化测试新思路:千问3.5-27B生成与执行UI测试用例 1. 为什么我们需要重新思考UI测试 作为一位经历过手工测试、录制回放、脚本维护三个阶段的老测试工程师,我始终被一个问题困扰:测试用例的维护成本永远与业务复杂度成正比。直到…...

PPT转视频工具,就得保留全部动画效果 —— 使用YOCO有感

在做课件视频这件事上,我踩过不少坑。一开始我以为,PPT转视频无非就是“把页面录下来”,后来才发现,真正决定视频质量的,不是画面清不清,而是PPT里的“动画逻辑”有没有被完整保留。而这一点,恰…...

JavaScript typeof 操作符详解

JavaScript typeof 操作符详解 引言 在JavaScript中,typeof 是一个一元运算符,用于检测给定变量的数据类型。它是JavaScript中最常用的类型检测方法之一。本文将详细介绍 typeof 操作符的用法、返回值以及注意事项。 typeof 运算符概述 typeof 运算符可以用于检测任何Jav…...

OpenClaw+Qwen3.5-9B低成本自动化:自建模型比API省80%

OpenClawQwen3.5-9B低成本自动化:自建模型比API省80% 1. 为什么我要研究OpenClaw的成本问题 上个月我尝试用OpenClaw自动化处理积压的3000多份PDF文件,结果被商用API的账单吓了一跳——单次归档任务的token消耗折算下来居然要12美元。这让我开始思考&a…...

如何分析网站SEO关键词排名

如何分析网站SEO关键词排名 在当今的互联网时代,网站的SEO(搜索引擎优化)已经成为了提升网站流量和提高品牌知名度的重要手段之一。其中,关键词排名分析是SEO工作的核心环节。一个网站如果能够在搜索引擎上的关键词排名靠前&…...

24GB显存利用率优化:OpenClaw长任务链对接Qwen3-14B的7个技巧

24GB显存利用率优化:OpenClaw长任务链对接Qwen3-14B的7个技巧 1. 为什么需要关注显存利用率? 上周我尝试用OpenClaw自动化处理一个包含200份PDF文档的信息提取任务时,系统在运行到第37个文件时突然崩溃。查看日志才发现是显存耗尽导致的OOM…...

Git学习笔记作用及概述

作用及概述一、作用: 1.代码回溯 2.版本切换 3.多人协作 4.远程备份...