【MySQL】第六节—一文详解 | 表的约束(下)

【MySQL】第六节—一文详解 | 表的约束(下)

Hello,2026 我们见面啦!我是云边有个稻草人,新年第一篇U·ェ·U,ACTION!

《MySQL》本篇文章所属专栏—持续更新中—欢迎订阅!

目录

6、自增长 auto_increment 

7、唯一键 unique 

8、外键 foreign key 

9、综合案例 - 阅读 


【MySQL】第五节—一文详解 | 表的约束(上)-ZEEKLOG博客

正文开始——

6、自增长 auto_increment 

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

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
  • auto_increment必须和主键搭配使用,不然就会报错!见下图:

经典案例:

特殊情况:

扩展:select last_insert_id()函数,查询的是最新一条插入的id的值

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结 构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。



当数据库很大时,想要快速的查找数据库当中的某些数据或者某些位置时,数据库可以单独开一份空间来维护数据库内容和页码之间的关系来提高查找的速度,所以,索引的本质是用空间来换取时间。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

索引后面会详细讲解....


7、唯一键 unique 

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于唯一键和主键的区别:



我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。(看下面的例子之后再回来体会这句话,体会主键的含义)

乍一听好像没啥区别,我们举一个例子:

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)



比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。



而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。



具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯 一键。



一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

案例:


8、外键 foreign key 

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:

foreign key (字段名) references 主表(列)

案例:

通常把班级表对应的主键作为其他表与班级表产生关联的数据,班级表作为主表,学生表作为从表。学生表里面的class_id作为与班级表产生关联的属性,就叫做“外键”,外键一定是在我们的从表当中建立的,主表只需要给别人提供能够让外界与自己产生关联的外键约束即可。

 

  • 如何理解外键约束?

首先我们承认,这个世界是数据很多都是相关性的。

理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。

此时,在实际使用的时候,可能会出现什么问题?

有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中? 比如计算机只开了计科100班,计科101班,但是在上课的学生里面竟然有计科102班的学生(这个班目前并不存在),这很明显是有问题的。

因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。


9、综合案例 - 阅读 

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

基本要求:

  • 每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)

SQL:仅供参考,自行发挥

-- 创建数据库 create database if not exists mall default character set utf8 ; -- 选择数据库 use mall; -- 创建数据库表 -- 商品 create table if not exists goods (   goods_id  int primary key auto_increment comment '商品编号',   goods_name varchar(32) not null comment '商品名称',   unitprice  int  not null default 0 comment '单价,单位分',   category  varchar(12) comment '商品分类',   provider  varchar(64) not null comment '供应商名称' ); -- 客户 create table if not exists customer (   customer_id  int primary key auto_increment comment '客户编号',   name varchar(32) not null comment '客户姓名',   address  varchar(256) comment '客户地址',   email  varchar(64) unique key comment '电子邮箱',   sex  enum('男','女') not null comment '性别',   card_id char(18) unique key comment '身份证' ); -- 购买 create table if not exists purchase (   order_id  int primary key auto_increment comment '订单号',   customer_id int comment '客户编号',   goods_id  int comment '商品编号',   nums  int default 0 comment '购买数量',   foreign key (customer_id) references customer(customer_id),   foreign key (goods_id) references goods(goods_id) );

完——


《依兰爱情故事》——方天雷

很久之前就听过的一首歌,应该是初中吧...

至此结束——

我是云边有个稻草人

期待与你的下一次相遇!

2026,加油!

Read more

NanoClaw 深度剖析:一个“AI 原生“架构的个人助手是如何运转的?

NanoClaw 深度剖析:一个“AI 原生“架构的个人助手是如何运转的?

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 1. 了解大厂经验 2. 拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 * 一、它到底是什么?—— 三句话说清楚 * 二、整体架构:一张图看懂数据流 * 三、数据层:SQLite 才是"真相的唯一来源" * 3.1 为什么选 SQLite? * 3.2 游标机制:如何做到"断点续传" * 四、消息循环:一颗永不停跳的心脏 * 五、容器化执行:安全隔离的艺术 * 5.1 为什么要用容器? * 5.

By Ne0inhk
FastAPI 进阶:中间件、依赖注入与 ORM

FastAPI 进阶:中间件、依赖注入与 ORM

目录 一、中间件(Middleware) 什么是中间件? 中间件的作用 如何定义中间件 多个中间件的执行顺序 二、依赖注入(Dependency Injection) 为什么需要依赖注入? 什么是依赖注入? 依赖注入的优势 依赖注入的应用场景 如何使用依赖注入 中间件 vs 依赖注入 三、ORM(对象关系映射) 什么是 ORM? ORM 的优势 常见 ORM 工具 ORM 使用流程 实战示例 1. 创建数据库引擎 2. 定义模型类 3. 创建数据库表 4. 在路由中使用 ORM 总结 FastAPI 作为 Python Web 框架,提供了强大的功能来构建高性能、易维护的

By Ne0inhk
从「亡羊补牢」到「规则先行」:金仓数据库 SQL 防火墙实战解析

从「亡羊补牢」到「规则先行」:金仓数据库 SQL 防火墙实战解析

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 从「亡羊补牢」到「规则先行」:金仓数据库 SQL 防火墙实战解析 * 一、SQL 注入原理 * 典型攻击示例 * 传统防御的局限 * 二、SQL 防火墙原理概述 * 三、核心优势 * 1. 99.99% 准确率 * 2. 性能稳定,损耗极低 * 3. 两步完成配置,自动建立白名单 * 四、配置操作演示 * 第一步:启用插件 * 第二步:进入学习模式,采集白名单 * 第三步:切换警告模式,验证白名单 * 第四步:切换报错模式,正式防护 * 五、总结 SQL 注入是数据库安全最顽固的威胁之一。

By Ne0inhk
HarmonyOS6半年磨一剑 - RcImage组件核心架构与状态管理机制

HarmonyOS6半年磨一剑 - RcImage组件核心架构与状态管理机制

文章目录 * 前言 * 项目简介 * 核心特性 * 开源计划 * rchoui官网 * 第一章: 组件架构设计 * 1.1 ComponentV2 装饰器体系 * 1.2 参数系统分层设计 * 1.3 类型系统设计 * 第二章: 状态管理机制 * 2.1 加载状态机设计 * 2.2 状态转换逻辑实现 * 2.3 预览状态管理 * 第三章: 生命周期管理 * 3.1 组件生命周期钩子 * 3.2 状态更新触发机制 * 第四章: 事件系统设计 * 4.1 事件分类与职责 * 4.2 事件触发时机与顺序 * 4.3 事件参数设计 * 第五章: 渲染优化策略

By Ne0inhk