news 2026/4/24 1:33:04

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【MySQL】第六节—一文详解 | 表的约束

以下是MySQL 表的约束(Constraints)一文详解,适合作为“第六节”的核心内容,内容覆盖 MySQL 8.0+ 主流用法,包含原理、语法、常见场景、注意事项和面试/生产高频考点。

一、MySQL 表约束总览(2025–2026 主流)

约束类型英文名称作用是否允许 NULL是否允许重复是否可以有多列是否可以自定义名称是否可以延迟检查
主键约束PRIMARY KEY唯一标识每一行,唯一 + 非空可以(复合主键)可以
唯一约束UNIQUE列/列组合值唯一可以可以可以
非空约束NOT NULL该列不允许为空可以不可
默认值约束DEFAULT未指定值时自动填充默认值不可
检查约束CHECK自定义条件校验(MySQL 8.0.16+ 真正生效)可以可以
外键约束FOREIGN KEY维护参照完整性可以可以可以可以可以(延迟)

二、每种约束详细语法与实战说明

1. 主键约束(PRIMARY KEY)
-- 方式1:列级定义(最常见)CREATETABLEusers(idBIGINTNOTNULLAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULL);-- 方式2:表级定义(适合复合主键)CREATETABLEorder_items(order_idBIGINTNOTNULL,item_idBIGINTNOTNULL,quantityINTNOTNULL,PRIMARYKEY(order_id,item_id));-- 方式3:已有表添加主键(必须先满足唯一+非空)ALTERTABLEusersADDPRIMARYKEY(id);

重要特性

  • 自动创建唯一索引(名为PRIMARY
  • InnoDB 表必须有主键(推荐自增 BIGINT)
  • 没有主键的表会隐式创建 6 字节 ROWID 作为聚簇索引(不推荐)
2. 唯一约束(UNIQUE)
-- 列级CREATETABLEemployees(emp_noINTPRIMARYKEY,emailVARCHAR(100)UNIQUENOTNULL);-- 表级(复合唯一)CREATETABLEuser_roles(user_idBIGINTNOTNULL,role_idBIGINTNOTNULL,UNIQUEKEYuk_user_role(user_id,role_id));-- 已有表添加ALTERTABLEemployeesADDUNIQUEKEYuk_email(email);ALTERTABLEuser_rolesADDUNIQUE(user_id,role_id);

关键区别vs 主键:

项目PRIMARY KEYUNIQUE
允许 NULL是(但 NULL 不算重复)
数量限制一个表只能一个可以多个
是否自动创建索引是(聚簇索引)是(普通唯一索引)
名字固定为 PRIMARY可自定义

面试常问:一张表可以有多个 UNIQUE 约束,但只能有一个 PRIMARY KEY。

3. 非空约束(NOT NULL)
CREATETABLEproducts(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULLDEFAULT0.00,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP);

注意

  • 已有表添加 NOT NULL 时,列中不能有 NULL 值,否则报错
  • ALTER TABLE ... MODIFY COLUMN可以添加/移除 NOT NULL
4. 默认值(DEFAULT)
-- 普通默认值statusTINYINTNOTNULLDEFAULT0,-- 表达式默认值(MySQL 8.0.13+)created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,-- 虚拟列默认值(函数表达式)full_nameVARCHAR(101)GENERATED ALWAYSAS(CONCAT(first_name,' ',last_name))STORED,

MySQL 8.0+ 支持的 DEFAULT 表达式

  • CURRENT_TIMESTAMP
  • NOW()
  • UUID()
  • (expression) AS …
5. 检查约束(CHECK)—— MySQL 8.0.16+ 真正生效
CREATETABLEemployees(idINTPRIMARYKEYAUTO_INCREMENT,ageTINYINTUNSIGNEDNOTNULL,salaryDECIMAL(10,2)NOTNULL,-- 方式1:列级CHECK(age>=18ANDage<=65),-- 方式2:表级(可跨列)CONSTRAINTchk_salaryCHECK(salary>=3000ANDsalary<=100000));-- 已有表添加ALTERTABLEemployeesADDCONSTRAINTchk_ageCHECK(ageBETWEEN18AND65);

重要提醒

  • MySQL 5.7 及之前版本:CHECK 语法可以写,但不生效(只是语法通过)
  • 8.0.16 之后才真正校验
  • 性能开销较小,但复杂 CHECK 会影响写入性能
6. 外键约束(FOREIGN KEY)——参照完整性
-- 先创建主表CREATETABLEdepartments(dept_idINTPRIMARYKEYAUTO_INCREMENT,dept_nameVARCHAR(50)NOTNULLUNIQUE);-- 再创建从表CREATETABLEemployees(emp_idINTPRIMARYKEYAUTO_INCREMENT,dept_idINTNOTNULL,nameVARCHAR(50)NOTNULL,FOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)-- 更完整的写法(推荐生产环境)CONSTRAINTfk_emp_deptFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETERESTRICT-- 默认行为ONUPDATECASCADE);

外键动作选项(ON DELETE / ON UPDATE)

选项含义典型使用场景
RESTRICT禁止删除/更新主表记录(默认)严格保护数据完整性
CASCADE级联删除/更新主从数据必须保持一致(如订单-明细)
SET NULL主表删除/更新后从表对应字段置 NULL可选关联关系
NO ACTION同 RESTRICT(MySQL 中等价)

外键使用建议(生产环境)

  • 小型项目、性能敏感表 → 可以不建外键,用业务代码保证
  • 中大型业务系统、数据质量要求高 → 强烈建议建外键 + 合适的 ON DELETE/UPDATE 策略
  • 外键会创建索引(如果从表字段没有索引,会自动创建)

三、约束的增删改查操作总结

-- 查看表所有约束SHOWCREATETABLEemployees\G-- 查看所有外键SELECT*FROMinformation_schema.REFERENTIAL_CONSTRAINTSWHERETABLE_SCHEMA='your_db';-- 删除约束(必须知道约束名)ALTERTABLEemployeesDROPFOREIGNKEYfk_emp_dept;ALTERTABLEemployeesDROPPRIMARYKEY;ALTERTABLEemployeesDROPINDEXuk_email;ALTERTABLEemployeesMODIFYCOLUMNemailVARCHAR(100)NULL;-- 移除 NOT NULL-- 添加约束(已有数据要满足条件)ALTERTABLEemployeesADDUNIQUE(email);ALTERTABLEemployeesADDCONSTRAINTpk_empPRIMARYKEY(emp_id);

四、面试/生产高频问题 20 条(建议背熟)

  1. 主键和唯一约束的本质区别是什么?
  2. 一张表可以有几个主键?几个唯一约束?
  3. MySQL 外键一定需要创建索引吗?
  4. ON DELETE CASCADE 和 ON DELETE SET NULL 的适用场景分别是什么?
  5. MySQL 什么时候真正开始校验 CHECK 约束?
  6. 没有主键的 InnoDB 表底层是怎么存储的?
  7. 复合主键的顺序对查询性能有影响吗?
  8. 外键约束会影响 insert/update/delete 的性能吗?
  9. 如何批量删除外键约束?
  10. DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 的典型使用场景?

希望这份总结能帮你彻底搞懂 MySQL 表的约束体系。

需要我继续补充外键级联实际案例CHECK 约束性能测试无主键表 vs 有主键性能对比等更深入的内容吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:43:49

argocd 命令使用详解

一份详细的 ArgoCD CLI 命令使用指南&#xff0c;按「基础准备→核心命令&#xff08;按使用场景分类&#xff09;→高级用法→实用技巧」的结构整理&#xff0c;覆盖日常运维90%以上的场景&#xff0c;新手也能快速上手。 一、前置准备 1. 安装 ArgoCD CLI 方式1&#xff1…

作者头像 李华
网站建设 2026/4/21 19:39:18

【网络攻防】最常见的网络攻防技术——网络攻防入门(通俗易懂)

引言 网络攻防技术是维护数字化时代信息安全的关键。本文旨在为网络安全初学者提供一个清晰的入门指南&#xff0c;通过基础概念的介绍和简单例子的实践&#xff0c;帮助理解网络攻防的基本方法。 1. 了解网络基础 在深入研究网络攻防之前&#xff0c;首先需要理解一些网络通…

作者头像 李华
网站建设 2026/4/17 21:37:14

Nodejs+vue安卓的党建工作管理系统的设计与实现小程序

文章目录党建工作管理系统摘要系统技术架构核心功能模块系统特色功能安全与性能优化--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;党建工作管理系统摘要 党建工作管理系统基于Node.js后端和Vue前端技术栈&#x…

作者头像 李华
网站建设 2026/4/23 10:33:08

专科生必看!10个高效降AIGC工具推荐,避坑指南来了

专科生必看&#xff01;10个高效降AIGC工具推荐&#xff0c;避坑指南来了 AI降重工具&#xff0c;让论文更“自然” 在当前学术环境中&#xff0c;越来越多的高校和机构开始采用AIGC检测系统来评估论文的原创性。对于专科生而言&#xff0c;这无疑增加了论文写作的难度。如何在…

作者头像 李华
网站建设 2026/4/22 17:55:16

springboot社区家政管理系统设计开发实现

背景分析 随着城市化进程加快和双职工家庭增多&#xff0c;家政服务需求呈现爆发式增长。传统家政行业存在信息不对称、服务标准不统一、预约效率低下等问题。根据2022年中国家政服务业发展报告&#xff0c;市场规模已突破万亿元&#xff0c;但数字化管理覆盖率不足30%&#x…

作者头像 李华