当前位置:首页 > 工具 > 正文内容

深入理解 MySQL 数据表约束机制与应用

访客 工具 2026年6月15日 1

在关系型数据库中,约束(Constraint)是确保数据完整性与有效性的核心机制。通过在表结构上施加限制条件,数据库管理系统能够自动拦截不符合业务规则的脏数据。

约束的主要分类

在 MySQL 中,常用的约束类型包括以下几种:

  • 非空约束(NOT NULL):强制字段值不能为空。
  • 唯一约束(UNIQUE):确保字段或字段组合的值在表中不重复。
  • 主键约束(PRIMARY KEY):唯一标识表中的每一行记录,兼具非空和唯一特性。
  • 外键约束(FOREIGN KEY):维护表与表之间的参照完整性。
  • 检查约束(CHECK):限制字段值必须满足指定的布尔表达式。注:早期版本的 MySQL 会忽略 CHECK 约束,但从 MySQL 8.0.16 开始,CHECK 约束已被正式支持并强制执行。

非空约束(NOT NULL)

非空约束用于保证某列在插入或更新时必须有明确的值,不允许使用 NULL。这在处理核心业务字段(如用户名、订单号)时非常关键。

CREATE TABLE sys_employee (
    emp_id INT,
    emp_name VARCHAR(50) NOT NULL,
    hire_date DATE NOT NULL
);

唯一约束(UNIQUE)

唯一约束确保指定列的值在整个表中是独一无二的。与主键不同,唯一约束允许存在 NULL 值(在 MySQL 中,允许多个 NULL 值同时存在而不触发唯一性冲突)。

1. 列级唯一约束

直接在字段定义后追加 UNIQUE 关键字,适用于单列去重。

CREATE TABLE sys_employee (
    emp_id INT,
    emp_name VARCHAR(50) NOT NULL,
    id_card_number VARCHAR(18) UNIQUE
);

2. 表级联合唯一约束

当需要确保多个字段的组合不重复时(例如同一个部门下的员工编号不能重复),可以在表定义的末尾使用表级约束。

CREATE TABLE sys_employee (
    emp_id INT,
    dept_id INT,
    emp_code VARCHAR(20),
    UNIQUE KEY uk_dept_emp_code (dept_id, emp_code)
);

3. 自定义约束名称

为约束显式命名是一个良好的工程实践,这使得后续通过 ALTER TABLE 修改或删除约束时更加方便。

CREATE TABLE sys_employee (
    emp_id INT,
    work_email VARCHAR(100),
    CONSTRAINT chk_unique_work_email UNIQUE (work_email)
);

主键约束(PRIMARY KEY)

主键是表中记录的"身份证",用于唯一标识每一行数据。一个设计良好的关系表必须拥有主键。即使两行记录的业务数据完全相同,只要主键不同,它们在物理和逻辑上就是两条独立的记录。

1. 单列主键

最常见的形式,通常使用自增整数或分布式 ID 作为单一主键。

CREATE TABLE sys_department (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100) NOT NULL
);

2. 复合主键

当单一字段无法唯一标识记录时,可以将多个字段组合作为主键。复合主键必须在表级进行定义。

CREATE TABLE sys_emp_role (
    emp_id INT,
    role_id INT,
    assign_date DATE,
    PRIMARY KEY (emp_id, role_id)
);

主键与 NOT NULL + UNIQUE 的本质差异

从数据校验的表象来看,为字段同时添加 NOT NULLUNIQUE 约束,其效果与 PRIMARY KEY 完全一致:既不能为空,也不能重复。然而,在 MySQL 的 InnoDB 存储引擎底层,两者存在本质区别:

  • 索引结构:主键会自动创建聚簇索引(Clustered Index),表中的数据行物理存储顺序与主键顺序一致,直接决定了数据的检索效率。而 UNIQUE 约束创建的是二级唯一索引(Secondary Unique Index)
  • 数量限制:一张表只能有一个主键,但可以拥有多个 UNIQUE 约束。
  • NULL 值处理:主键绝对不允许 NULL,而 UNIQUE 字段在 MySQL 中允许包含 NULL 值。

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。