【MySQL数据库】彻底搞懂 MySQL 表的约束:约束、主键、外键等核心概念一网打尽

【MySQL数据库】彻底搞懂 MySQL 表的约束:约束、主键、外键等核心概念一网打尽

请添加图片描述

半桔个人主页
 🔥 个人专栏: 《Linux手册》《手撕面试算法》《C++从入门到入土》

🔖青年的动人之处,就在于勇气,和他们的远大前程。 -王小波-


文章目录

前言

在数据库技术体系中,是承载与组织数据的核心载体,其设计质量直接关乎数据管理的效率、准确性,以及整个系统的可扩展性。面对复杂业务场景与大规模数据时,如何保障表内数据的完整性与一致性、如何精准定义字段特性、如何合理构建表间关联关系,是数据库设计与开发过程中绕不开的关键问题。

  1. 表的约束、空属性、默认值等基础设置,是规范单表数据的“底层规则”;
  2. 主键、自增长主键、唯一键等机制,为数据的“唯一性标识”提供保障;
  3. 外键则搭建起表与表之间的关联桥梁,支撑着复杂业务逻辑下的数据参照完整性与关联一致性。

本文将围绕数据库表设计的核心概念与技术展开,从“表的约束”“空属性”等基础内容,到“主键”“外键”等关键约束,逐步解析它们的作用、使用方式与实践场景,帮助读者建立对数据库表设计规则的系统认知,为高效开展数据库建模与开发工作奠定基础。

一. 表的约束:数据完整性的保障

  1. 数据库的表中一定会有各种约束,通过这些约束,让我们未来插入数据库中的数据是符合预期的,能够更好的保证数据的合法性,同时让数据库更好管理数据;
  2. 约束本质就是倒逼程序员插入正确的数据;反过来,在MySQL看来只要是插入数据库中的数据都是合法的,符合数据约束的。

表的约束最根本的目的就是为了:保证数据的完整性和可预期性。

表的约束有很多,本文主要介绍以下几个:null/not nulldefaultcommentzerofillprimary keyauto_incrementunique_key

二. 空属性:控制字段的非空特性

  • 两个值:nullnot null
  • 数据库的默认字段基本都是null,但是对于默写数据我们希望用户进行填写;就像问卷里面有些选填,有些必填的选项一样;

通过将列属性设置为not null,该列数据就不能为空,否则mysql不会将数据插入到数据库中:

请添加图片描述

可以看到,在上图中:第一次插入是成功的,但是第二次和第三次的插入都是失败的,让我们看一下第二次和第三次的原因:

  1. 第二次进行插入的时候,Field 'name' doesn't have a default value,它说name没有一个默认值,这也就是我们上面说的数据库的默认字段基本都是null,通过上面表中的Default列我们也可以看出来;
  2. 第三次插入是Column 'name' cannot be null,我们显式的插入null不被允许,这也不难理解,因为我们设置的本来就是not null

三. 默认值:为字段预置初始数据

  • 默认值就类似于C++中的缺省值,当没有显示输入的时候就使用默认值;

在数据库中默认值基本都是null,因此我们在插入错误的时候要区分出是not null还是默认值的问题。

请添加图片描述

如上图所示,当我们没有进行显式的传入gender的值得时候,默认就是male

区分空属性和默认值:

  1. 空属性,指的是该位置不能填null,不论是用户显示传入还是使用默认值都不行;
  2. 默认值,是进行设置当用户不进行填写时默认的数据。
    PS:如果在进行建表的时候,没有显式写default的值,MySQL会进行优化,在该列后添加default null

空属性和默认值并不冲突,两者是相互补充,相辅相成的关系。

四. 列描述:为字段添加说明性文字

列描述就相当于编程中的注释

请添加图片描述

五. zerofill:数字字段的前导零填充

zerofill是一种格式化输出,就类似于C语言中使用printf函数来对数字进行对其一样:

请添加图片描述
在进行建表的时候,我们好像也并没有指定格式化数字的长度呀,它这里为什么默认是10???
请添加图片描述

在建表的时候,虽然我们填写的是int类型,但是MySQL会对我们的指令进行优化,类型变成int(10)该10就是表格再进行显示的时候,如果数字的位数不足110,前面就会自动补0

当然我们也可以进行指定,显示的位数:

请添加图片描述
请添加图片描述
思考:那么为什么int默认是10???

因为int可以表示的最大值也就是21亿多,用10位就可以足够表示了。

六. 主键:表中记录的唯一标识

  • 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;
  • 主键所在的列通常是整数类型。

主键将类似于map中的key值是为了提高表的查询速度,优化查询效率的。

6.1 主键约束

主键在进行插入的时候也有一些规则:

  1. 主键不能为null;
  2. 主键不能重复;
  3. 主键必须是整数类型;
  4. 一张表只能有一个主键;
  5. 如果一张表没有主键,MySQL会将表的DB_ROW_ID作为主键值。

6.2 主键操作

设置主键有两种方式:

建表之后再添加主键:

请添加图片描述

在创建表的时候就指明主键:

请添加图片描述

删除主键,语法:alter table 表名 drop primary key

6.3 复合主键

主键可以只由一列组成,也可以由多列组成,就像C++中的tuple类型一样,一个对象中可以包含多个类型:

请添加图片描述

七. 自增长主键:自动生成唯一标识

  • auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。
  • 通常和主键搭配使用,作为逻辑主键。

演示:

请添加图片描述

插入时,不指定主键值会自增:

请添加图片描述

八. 唯一键:保证字段值的唯一性

我们可以通过主键来保证数据库中数据的唯一性,但是主键只能有一个,我们有时候也希望一些非主键的列也能是唯一的,此时就可以使用唯一键

语法:unique key与主键的使用类似。

唯一键与主键的区别:

  1. 唯一键允许一个字段为null,并且运行有多个null,因为空字段不作唯一性比较
  2. 主键保证在表中进行查找的时候找到的数据是唯一的,唯一键是为了保证数据在该列是唯一的。

关于唯一键的使用与主键类似,此处就不再进行演示了。

九. 外键:建立表与表之间的关联

  • 用于定义表与表之间的关系。

有时我们希望将两张表关联起来:

请添加图片描述

我们希望在先员工表中插入的时候,其dept_id是满足条件的,存在该部门,如果插入是不满足条件的,我们也希望MySQL对插入进行拦截,此时就可以使用外键约束

语法:foreign key(子表中关联的列名称) references 主表中关联的列名称.

请添加图片描述


请添加图片描述

外键的好处:

  1. 将从表与主表的关联关系,交给MySQL进行管理,维护好表与表之间的关系;
  2. 产生外键约束。

Read more

英伟达免费开源大参数模型 Nemotron 3 Super 全解析

英伟达免费开源大参数模型 Nemotron 3 Super 全解析

前言:本文兼顾技术深度与可读性,全面解析英伟达最新免费开源大参数模型 Nemotron 3 Super——从模型核心特性、实测表现,到与主流开源模型的横向对比,再到 OpenClaw 中的具体使用方法,全程聚焦“免费、开源、高性能”三大核心,帮开发者快速上手、高效应用,适合各类开发者、技术爱好者及相关从业者阅读参考。 一、模型全景介绍:英伟达“开源王炸”Nemotron 3 Super 在 AI 大模型赛道,英伟达不再满足于“卖铲子”(GPU 硬件),而是亲自下场“挖金子”——近期重磅推出的 Nemotron 3 Super,作为其史上最强开源权重模型,以 1280 亿总参数量(推理仅激活 120 亿)、100 万

By Ne0inhk
GitNexus 核心引擎深度解析

GitNexus 核心引擎深度解析

GitNexus 核心引擎深度解析 索引流水线、社区检测与流程追踪、混合搜索与嵌入生成 一、入口类与架构关系 GitNexus 的核心引擎由三个相互协作的子系统构成:索引流水线(Ingestion Pipeline)、社区与流程检测(Community & Process Detection)、混合搜索与嵌入(Hybrid Search & Embeddings)。这三个子系统共同将原始代码库转换为可查询的知识图谱。 1.1 核心类关系图 1.2 关键数据结构 KnowledgeGraph:知识图谱的核心数据结构,包含节点(Node)和关系(Relationship)集合。节点类型包括 File、Folder、Function、Class、Method、Interface、Community、Process;关系类型包括 CALLS、IMPORTS、EXTENDS、IMPLEMENTS、

By Ne0inhk
OpenClaw 大更新:支持 GPT-5.4、记忆热插拔,GitHub Star 突破 28 万

OpenClaw 大更新:支持 GPT-5.4、记忆热插拔,GitHub Star 突破 28 万

AI Agent 框架 OpenClaw 上周日发布 2026.3.7 版本更新,最受关注的变化之一,是正式加入对 GPT-5.4 的支持。与此同时,新版本还带来了 记忆系统热插拔(Hot-Swappable Memory)、Context Engine 插件体系、持久化频道绑定 等关键能力,并在模型生态、搜索工具链以及安全机制方面进行了系统升级。 对于越来越多正在尝试部署 AI Agent 的团队来说,这一版本的意义不只是功能更新,更像是一次 架构层级的升级。 一、插件化上下文引擎:突破上下文窗口限制 此次更新最核心的变化之一,是引入 Context Engine 插件接口。 新的插件体系提供完整的生命周期钩子,并通过基于插槽的注册表与配置驱动解析机制,使开发者可以接入不同的上下文管理策略。为了兼容旧行为,OpenClaw 同时加入了 LegacyContextEngine 包装器,在未配置插件时仍保持原有的上下文压缩逻辑。

By Ne0inhk
1.5k stars!阿里开源 PageAgent:让 AI 直接“住进“你的网页,用自然语言操控一切!

1.5k stars!阿里开源 PageAgent:让 AI 直接“住进“你的网页,用自然语言操控一切!

阿里开源 PageAgent:让 AI 直接"住进"你的网页,用自然语言操控一切 不需要浏览器插件,不需要 Python,不需要截图——一行 JS,让你的网页秒变 AI 智能体。 一、先说痛点:Web 自动化为什么这么难? 如果你用过 Selenium、Playwright,或者最近流行的 browser-use,你一定遇到过这些头疼的问题: * 环境太重:得装 Python、headless 浏览器、各种依赖,部署复杂,维护成本高; * 依赖截图 + OCR:很多方案靠多模态模型"看图操作",慢、贵、还不准; * 权限门槛高:要控制浏览器,往往需要特殊权限甚至操作系统级别的访问; * 对现有产品改造成本大:

By Ne0inhk