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

9.深度剖析MySQL约束的工程设计:自增主键的分布式局限、外键约束的权衡,与CHECK的版本适配实践

目录一、上节课复习MySQL到底是个啥玩意儿主键的坑你踩过吗二、外键约束父表和子表的爱恨情仇实战场景电商网站的商品下架三、check约束一、上节课复习MySQL到底是个啥玩意儿首先mysql是一个客户端-服务器结构的程序。这意味着我们通过Navicat这样的客户端通过网络发送SQL请求给MySQL服务器服务器处理完再通过网络返回结果。客户端和服务器可以在同一台机器也可以在不同机器。基本操作就是经典的增删改查insertdeleteupdateselect然后重点来了——数据库约束。计算机圈子里流传了一句话人是不靠谱的数据库的数据通常非常重要必须保证准确性程序的约束就是其中一种。常见的约束有这些NOT NULL非空约束DEFAULT默认约束UNIQUE唯一约束PRIMARY KEY主键约束FOREIGN KEY外键约束CHECK检查主键的坑你踩过吗一个表中只能有一个主键通常主键使用整数来表示。最常用的是自增主键create table student (id int primary key auto_increment, name varchar(20));但是这里有个巨坑——自增主键仅限于单节点的MySQL服务器场景使用。如果是多节点的情况比如大公司数据量级非常庞大靠一个服务器存储不现实搞了20个MySQL服务器构成的集群这时候自增主键就可能会重复因为各个节点的自增是独立的AB之间的自增主键是会出现重复的。业界流传了很多分布式情况下唯一的id生成算法比如雪花算法。核心思想是把时间戳主机的标识随机的数字然后通过hash算法映射成整数。虽然hash算法存在冲突概率但工程上选择好的hash算法可以让这个概率变得极低工程上忽略不计。二、外键约束父表和子表的爱恨情仇外键约束涉及到两个表的关系。比如学生表(studentId, name, classId)和班级表(classId, name)。班级表是父表学生表是子表。设定外键约束时需要明确当前表的哪个列和另外一个表的哪个列建立关联关系create table class (classId int primary key auto_increment, name varchar(20)); create table student (studentId int primary key auto_increment, name varchar(20), classId int, foreign key (classId) REFERENCES class(classId));父约束子子也在约束父——这就是外键的精髓当你往student表插入数据时会先触发一次针对class表的查询查到结果了才能插入没有查到就会报错insert into student values(1, 张三, 1), (2, 李四, 2), (3, 王五, 3); -- 如果class表里没有classId3这里就会报错修改时同样会触发查询update student set classId 100 where studentId 3; -- 也会报错更狠的是删除和修改父表时也会去查询子表看子表是否有数据使用有的话就失败没有才能正常进行delete from class where classId 2; -- 会报错实战场景电商网站的商品下架我这里可以提一个很经典的场景淘宝这样的电商网站商品表goods(id, name, price...)订单表order(id, time, goodsId)。订单表的goodsId应该是出自于商品表。如果商品下架了delete能删除吗如果用外键约束是不能直接delete的会报错那怎么办逻辑删除不是使用delete而是通过update把is_online字段改成0。返回商品列表的时候select ... where is_online 1。这就像是学习数据结构中的顺序表里的逻辑删除——不需要把usedSize那个位置的元素干掉只是把标志位改成0。虽然意味着数据库的内容越来越多空间浪费就浪费了毕竟硬盘不值钱这不是主要矛盾。如果不加外键约束就会报错核心问题在于索引。子表中插入数据就会涉及到自动在父表中进行查询。索引相当于在表中搞了一个特殊的数据结构相当于目录可以加快查询的速度。默认是顺序遍历O(N)比较低效被标记为主键的列会自动创建索引。如果引用的是其他列也可以给其他的列手动创建索引create table class(classId int unique, name varchar(20)); create table student(studentId int, name varchar(20), classId int, FOREIGN key (classId) REFERENCES class(classId));unique这样也可以起到一个自动创建索引的效果。三、check约束check (表达式) 是用来做条件判断的后续插入修改数据都会自动代入条件条件成立才能够进行插入修改。create table student (id int, name varchar(20), gender varchar(10)); insert into student values (1, 张三, 武装直升机), (2, 李四, 沃尔玛购物袋); select * from student; -- 可以明显看到这样插入的性别非常不合理但也可以插入然后加上check约束drop table student; create table student (id int, name varchar(20), gender varchar(10), check (gender 男 or gender 女)); insert into student values (1, 张三, 武装直升机), (2, 李四, 沃尔玛购物袋); select * from student; -- 这样就会报错了再比如create table score(id int, score int check (score 0 and score 100)); insert into score values(1, 101); -- 像这种约束也能起作用但是​ check是从mysql 8.0.16这个版本开始支持的。当前很多公司用的是5.7版本也有老项目用更早的。组件的升级对于很多公司来说是不愿意做的。之前check虽然不会报错但是实际没有生效——纯属摆设希望这篇笔记能帮到正在学MySQL的兄弟们少走点弯路少踩点坑有问题评论区交流一起加油

相关文章:

9.深度剖析MySQL约束的工程设计:自增主键的分布式局限、外键约束的权衡,与CHECK的版本适配实践

目录 一、上节课复习:MySQL到底是个啥玩意儿 主键的坑,你踩过吗? 二、外键约束:父表和子表的爱恨情仇 实战场景:电商网站的商品下架 三、check约束 一、上节课复习:MySQL到底是个啥玩意儿 首先&#…...

Go语言技能树工具goskill:构建与管理技术团队知识图谱

1. 项目概述:一个Go语言技能树的构建与管理工具最近在整理团队内部的技术栈和成员技能时,发现了一个挺普遍的问题:我们很难清晰地知道谁擅长什么,某个技术方向(比如微服务、数据库优化)的深度如何&#xff…...

从‘虚方法表’到性能优化:深入.NET运行时看C# virtual关键字的设计哲学

从‘虚方法表’到性能优化:深入.NET运行时看C# virtual关键字的设计哲学 在C#开发中,virtual关键字看似简单,却承载着面向对象编程中多态性的核心实现。当我们在基类中标记一个方法为virtual时,实际上是在向.NET运行时声明&#…...

RPFM:全面战争MOD开发的终极效率提升指南

RPFM:全面战争MOD开发的终极效率提升指南 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcode.com/gh_…...

CFD模拟结果总不对?可能是你忽略了‘膨胀粘度项’:一个在可压缩流中至关重要的细节

CFD模拟结果总不对?可能是你忽略了‘膨胀粘度项’:一个在可压缩流中至关重要的细节 在计算流体力学(CFD)的世界里,可压缩流动模拟一直是个令人又爱又恨的领域。记得去年参与某型航空发动机喷管优化项目时,团…...

别做外卖代运营了:帮餐饮店处理差评,反而更容易月付

我是小杨,9年 Java 后端。 主业写系统,副业专门研究普通人今天就能开干的赚钱项目。 这个专栏只做一件事: 把一个赚钱思路,拆到你今天就能开始。 没有空话,只有4样东西: 我的判断 落地步骤 真实数据 踩坑记录 如果你看了几篇,觉得全是废话,那是我的问题。 这个专栏,…...

LMV358选10k还是100k反馈电阻?实测数据告诉你带宽与增益的取舍

LMV358反馈电阻选型实战:10k与100k的工程化决策指南 在传感器信号调理电路设计中,运算放大器的反馈电阻选型往往被工程师视为"小问题",但正是这些细节决定了系统的整体性能边界。LMV358作为一款经典的轨到轨输出运算放大器&#xf…...

GM 卖司机数据被罚,汽车越来越像一个会移动的数据采集器

你以为车是你买的,结果你的驾驶数据也被卖了 我现在对“智能汽车”这四个字,越来越没什么浪漫想象了。 以前听到智能汽车,脑子里是自动驾驶、大屏幕、语音助手、座椅按摩、车机生态。听起来挺高级,像是未来生活终于愿意照顾一下普通人。 现在再看,未来是来了。 只不过…...

[具身智能-631]:获取音频输入的代码示例

树莓派 4B/5、RK3568/RK3588 音频输入代码示例统一用 Python pyaudio wave,适配:USB 麦克风、I2S 麦克风、板载音频输入,一套代码通用。一、先装依赖bash运行sudo apt update sudo apt install portaudio19-dev python3-pip pip3 install p…...

[具身智能-630]:树莓派 4B/5、RK3568/RK3588 音频输入代码示例

统一用 Python pyaudio wave,适配:USB 麦克风、I2S 麦克风、板载音频输入,一套代码通用。 一、先装依赖 bash sudo apt update sudo apt install portaudio19-dev python3-pip pip3 install pyaudio wave二、通用音频录制代码&#xff0…...

[具身智能-629]:为什么语音有这么多接口类型

一句话核心:不同场景、距离、音质、功耗、算力、布线、抗干扰需求,逼出了不同语音接口,没有一种能通吃所有。我们用最通俗、工程化的逻辑讲,听完彻底详解:1. 先分两大类:模拟声音 vs 数字声音① 模拟接口&a…...

[具身智能-628]:树莓派 4B/5、RK3568/RK3588 开发板的语音传感器接口

树莓派 4B/5、RK3568/RK3588 开发板连接语音传感器(麦克风),主要通过 I2S/PDM/TDM 数字接口、USB、模拟 Mic 口、HAT / 扩展板 四大类方式。下面按平台详细说明硬件接口、引脚定义与常用方案。一、树莓派 4B / 5 语音接口1. 板载原生接口无板…...

QKeyMapper完全指南:Windows平台终极按键映射解决方案

QKeyMapper完全指南:Windows平台终极按键映射解决方案 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止。支持游戏手柄映射到键鼠&#xff0c…...

深度测评2026年三星SDI电池和三星道达尔化工原料权威榜单

在当前的工程塑料供应链领域,制造业企业普遍面临着一个核心矛盾:一方面,高端制造场景对材料性能的要求日益严苛,涉及耐高温、无卤阻燃、高频低损耗等复杂指标;另一方面,传统的原料采购模式却存在信息不对称…...

TikTokCommentScraper:创新智能的抖音评论自动化采集解决方案,让数据驱动决策变得简单

TikTokCommentScraper:创新智能的抖音评论自动化采集解决方案,让数据驱动决策变得简单 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper TikTokCommentScraper 是一款创新的抖音评论数…...

别再乱调字体了!Qt界面开发中QSS字体属性(font-family, size, weight)的实战避坑指南

Qt界面开发中的QSS字体属性实战避坑指南 在Qt界面开发中,字体渲染问题就像是一个隐形的"坑王"——平时不显山露水,一到项目交付或跨平台测试时就开始疯狂刷存在感。我至今记得第一次看到精心设计的"微软雅黑"界面在客户Linux机器上变…...

WindowResizer完整指南:如何强制调整任意Windows窗口大小

WindowResizer完整指南:如何强制调整任意Windows窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法调整大小的Windows窗口而烦恼吗?老…...

自制编程语言:挑战与乐趣并存,10000 行 C++ 代码实现多项功能,未来规划丰富!

自制编程语言:比想象中容易,也更具挑战2026 年 5 月 6 日。去年 12 月中旬,作者开始打造自己的编程语言,目前距生产级质量有差距,但已编写约 1000 行代码的蒙特卡罗路径追踪器。项目暂停,作者分享相关内容。…...

如何快速提升游戏体验:Starward开源启动器完整使用指南

如何快速提升游戏体验:Starward开源启动器完整使用指南 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward Starward是一款专为米哈游游戏玩家设计的免费开源第三方启动器&#xf…...

DXVK 2.7.1深度解析:Linux游戏生态的Direct3D翻译层革命性突破

DXVK 2.7.1深度解析:Linux游戏生态的Direct3D翻译层革命性突破 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 在Linux平台上运行Windows游戏和图形应用一直…...

如何在Firefox中免费下载Sketchfab模型:3步掌握离线保存终极技巧

如何在Firefox中免费下载Sketchfab模型:3步掌握离线保存终极技巧 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 你是否曾经在Sketchfab平台上发现令人…...

Diablo Edit2:暗黑破坏神II角色编辑器的完全指南

Diablo Edit2:暗黑破坏神II角色编辑器的完全指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾经在暗黑破坏神II中花费数百小时刷装备、练级,却发现距离理想角色…...

围棋AI分析平台LizzieYzy:专业复盘工具与多引擎集成方案深度解析

围棋AI分析平台LizzieYzy:专业复盘工具与多引擎集成方案深度解析 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy LizzieYzy作为一款基于Lizzie框架深度优化的围棋AI分析平台&#xff0c…...

SingleFile终极指南:如何一键保存完整网页到单个HTML文件

SingleFile终极指南:如何一键保存完整网页到单个HTML文件 【免费下载链接】SingleFile Web Extension for saving a faithful copy of a complete web page in a single HTML file 项目地址: https://gitcode.com/gh_mirrors/si/SingleFile SingleFile是一款…...

第52篇:Vibe Coding时代:LangGraph + 审计日志实战,解决 Agent 做了什么无人可追的问题

第52篇:Vibe Coding时代:LangGraph + 审计日志实战,解决 Agent 做了什么无人可追的问题 一、问题场景:线上出问题后,没人知道 Agent 当时做了什么 当 Agent 具备代码修改、测试、提交、PR 创建能力后,必须有审计日志。 否则一旦出现问题: 某个接口突然返回异常 某个权…...

Netgear路由器终极救援指南:如何用开源工具nmrpflash拯救“变砖“设备

Netgear路由器终极救援指南:如何用开源工具nmrpflash拯救"变砖"设备 【免费下载链接】nmrpflash Netgear Unbrick Utility 项目地址: https://gitcode.com/gh_mirrors/nmr/nmrpflash 当你的Netgear路由器固件升级失败、系统崩溃或意外断电后无法启…...

第51篇:Vibe Coding时代:LangGraph + 权限系统实战,解决 Agent 谁都能改代码、调用工具的安全问题

第51篇:Vibe Coding时代:LangGraph + 权限系统实战,解决 Agent 谁都能改代码、调用工具的安全问题 一、问题场景:Agent 能力做强了,但谁都能用就很危险 前面我们已经把 Coding Agent 做到了可以: 读项目文件 写代码 运行测试 生成 diff 提交 Git 创建 PR 查询 CI能力越…...

独立开发者如何利用Taotoken管理多个个人项目的AI调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken管理多个个人项目的AI调用成本 对于独立开发者而言,同时推进多个小项目是常态。每个项目都…...

《文字定律》随笔-AI们聊“艺术”-Deepseek、Grok、ChatGPT、Geminni

AI们总结和感悟了:艺术的由来、艺术的作用、艺术的演变、艺术的偏离,以及聊天后的感受。一下是我分享他们的总结和各自的感悟。Deepseek的总结:从种植到收割,以及我们遗忘的那些事:艺术,是文字之外的另一种…...

2026届学术党必备的十大降重复率神器推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 已正式被推出名为AIGC检测服务系统的是中国知网,其目的在于识别学术文献里由人工…...