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

数据库约束条件

数据库约束是保证数据完整性、一致性、有效性的核心机制,它通过对表字段或表间关系施加规则,防止非法数据插入、更新或删除。MySQL 约束分为 字段级约束表级约束 两类,核心约束包括 主键、唯一、非空、外键、默认、检查 六种。


一、 核心约束类型及详解

1. 主键约束(PRIMARY KEY)—— 唯一标识记录

核心作用

  • 唯一标识表中的每一条记录,一张表只能有一个主键
  • 主键字段不允许为空(NOT NULL)值唯一
  • 主键字段会自动创建 聚簇索引(InnoDB 引擎),极大提升查询效率。
类型 语法示例 适用场景
单字段主键 字段级约束:id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 单字段唯一标识(如用户 ID、订单 ID)
复合主键 表级约束:PRIMARY KEY (user_id, course_id) 多字段组合唯一(如选课表:一个用户选同一门课只能有一条记录)
CREATE TABLE user (id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',phone CHAR(11) NOT NULL COMMENT '手机号',PRIMARY KEY (id)  -- 单字段主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 复合主键示例(选课表)
CREATE TABLE user_course (user_id INT UNSIGNED NOT NULL,course_id INT UNSIGNED NOT NULL,PRIMARY KEY (user_id, course_id)  -- 复合主键,避免重复选课
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 唯一约束(UNIQUE)—— 保证字段值唯一

核心作用

  • 保证指定字段的值唯一,一张表可以有多个唯一约束
  • 唯一约束字段允许为空(NULL),且允许多个 NULL 值(因为 NULL 不等于任何值)。
  • 唯一约束会自动创建 唯一索引,提升查询效率。
CREATE TABLE user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,phone CHAR(11) NOT NULL UNIQUE COMMENT '手机号唯一',  -- 字段级约束email VARCHAR(50) UNIQUE COMMENT '邮箱唯一',card_id CHAR(18) COMMENT '身份证号',-- 表级约束(支持复合唯一)UNIQUE KEY uk_card_id (card_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 非空约束(NOT NULL)—— 字段值不能为空

核心作用

  • 强制字段必须赋值,不允许插入 NULL 值。
  • 常用于核心业务字段(如姓名、手机号、订单金额),避免关键数据缺失。
CREATE TABLE user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL COMMENT '姓名不能为空',phone CHAR(11) NOT NULL COMMENT '手机号不能为空',age TINYINT UNSIGNED COMMENT '年龄可为空'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4. 默认约束(DEFAULT)—— 字段默认值

核心作用

  • 当插入记录时未给字段赋值,自动使用默认值填充。
  • 配合 NOT NULL 使用,避免非空字段插入报错。
CREATE TABLE user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,gender ENUM('male','female','unknown') NOT NULL DEFAULT 'unknown' COMMENT '默认未知性别',create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '默认当前时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5. 外键约束(FOREIGN KEY)—— 保证表间数据一致性

核心作用

  • 建立并强制 两个表之间的关联关系(主表 vs 从表)。
  • 保证从表的外键字段值必须在主表的主键 / 唯一字段中存在,防止无效关联数据。
  • 支持 级联操作(CASCADE):主表数据更新 / 删除时,从表数据自动同步更新 / 删除。
-- 从表创建外键
FOREIGN KEY (从表外键字段) REFERENCES 主表(主表关联字段)
[ON DELETE {CASCADE|SET NULL|RESTRICT}]
[ON UPDATE {CASCADE|SET NULL|RESTRICT}]
级联选项 作用
ON DELETE CASCADE 主表记录删除时,从表关联记录自动删除
ON DELETE SET NULL 主表记录删除时,从表外键字段设为 NULL(需从表外键允许 NULL)
ON DELETE RESTRICT 主表存在关联记录时,禁止删除主表记录(默认行为)
-- 主表:用户表
CREATE TABLE user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 从表:订单表(外键关联用户表id)
CREATE TABLE order_info (order_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,user_id INT UNSIGNED NOT NULL,amount DECIMAL(10,2) NOT NULL,-- 外键约束FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE RESTRICT  -- 主表有订单时,禁止删除用户ON UPDATE CASCADE   -- 主表用户id更新时,订单表user_id同步更新
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

6. 检查约束(CHECK)—— 强制字段值满足条件

核心作用

  • 强制字段值满足指定的条件表达式(如范围、格式)。
  • MySQL 5.7 及之前版本 支持语法但不生效,MySQL 8.0 及以上版本正式生效
CREATE TABLE user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age TINYINT UNSIGNED CHECK (age >= 0 AND age <= 120) COMMENT '年龄必须0-120',salary DECIMAL(10,2) CHECK (salary >= 0) COMMENT '薪资不能为负'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

二、 约束的添加与删除

1、给已有表添加约束

-- 添加主键约束
ALTER TABLE user ADD PRIMARY KEY (id);-- 添加唯一约束
ALTER TABLE user ADD UNIQUE KEY uk_phone (phone);-- 添加非空约束
ALTER TABLE user MODIFY COLUMN name VARCHAR(50) NOT NULL;-- 添加外键约束
ALTER TABLE order_info ADD FOREIGN KEY (user_id) REFERENCES user(id);

2、删除约束

-- 删除主键约束(主键无名称,直接用 PRIMARY KEY)
ALTER TABLE user DROP PRIMARY KEY;-- 删除唯一约束(需指定约束名)
ALTER TABLE user DROP INDEX uk_phone;-- 删除外键约束(需指定外键名)
ALTER TABLE order_info DROP FOREIGN KEY 外键名;-- 取消非空约束(修改字段允许 NULL)
ALTER TABLE user MODIFY COLUMN name VARCHAR(50) NULL;
http://www.jsqmd.com/news/622802/

相关文章:

  • 两个细则压顶之下,风电功率预测为什么会在报价偏差里悄悄吞掉一整块经营收益
  • 八大网盘直链解析工具:高效获取下载地址的智能解决方案
  • 还在为重复点击烦恼?这款鼠标连点器让你效率翻倍
  • 5分钟精通抖音批量下载神器:douyin-downloader完整使用指南
  • Step3-VL-10B多场景落地指南:医疗影像标注辅助、教育习题解析、设计稿分析
  • BlenderKit实战指南:3D创作效能革命的智能资产管理系统深度解析
  • 2026年脱硫脱硝一体化设备主流供应梯队盘点:玻璃钢湿电除尘器/砖厂玻璃钢脱硫塔/窑炉电厂湿电除尘器/脱硫脱硝一体化设备/选择指南 - 优质品牌商家
  • 告别硬接线!用Wireshark抓包实战解析IEC 61850 GOOSE报文(附报文文件)
  • ESP32-CAM与WebSocket:构建低延迟远程监控系统的实战指南
  • Sunshine游戏串流服务器终极指南:从架构解析到生产部署
  • WarcraftHelper完整指南:如何在现代电脑上完美运行魔兽争霸III
  • 深入解析UBOOT启动流程:BL0、BL1与BL2的协同工作机制
  • 重新定义桌面美学:掌握TranslucentTB的3个颠覆性任务栏定制方案
  • 如何30分钟掌握Switch注入:从零到运行自定义固件的完整指南
  • 【Unity中固定宽度文本截断与省略号处理方案】
  • 【神器 Collection】发票一页两联打印神器
  • YOLOv12与Matlab联合仿真:用于算法原型验证与性能分析
  • 为什么你的leaflet + sf地图在R 4.5中突然变灰?——3行代码修复坐标系自动降级漏洞(仅限4.5.0–4.5.1)
  • E-Hentai Downloader 终极指南:如何免费快速下载漫画并打包为ZIP文件
  • TwinCAT3 安装避坑与项目兼容性实战指南
  • agent的整体架构
  • Steam成就管理器:如何安全高效地掌控你的游戏成就数据
  • springboot 微信小程序的校园新闻发布系统
  • CefFlashBrowser:拯救Flash游戏的终极工具,让经典游戏重获新生![特殊字符]
  • LangGraph终极架构深度解析:构建高可用语言智能体的完整指南
  • 万象视界灵坛入门必看:Bright-Pixel UI组件库二次开发指南
  • 如何用GetQzonehistory完整备份你的QQ空间记忆:终极指南
  • 二维各向同性介质弹性波数值模拟:交错网格有限差分法的实现与优化
  • Nunchaku FLUX.1-dev 操作系统兼容性指南:Windows系统部署要点
  • FaceFusion新手必看:从零开始,手把手教你玩转AI换脸