1. 约束的本质与价值
刚接触MySQL的新手常犯一个错误——把数据约束简单理解为"限制条件"。实际上,约束是数据库主动维护数据完整性的智能机制。举个例子,当你在电商系统创建订单时,订单号必须唯一、用户ID必须存在、商品数量不能为负,这些业务规则正是通过约束来实现的。
我在实际项目中见过太多因为缺失约束导致的"脏数据":重复支付的订单、不存在的用户ID关联记录、负数库存等。这些问题往往在系统运行数月后才暴露,修复成本极高。合理的约束设计能在数据写入时就拦截非法操作,相当于给数据库装上了"防火墙"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 六大约束类型深度解析
2.1 非空约束(NOT NULL)
sql复制CREATE TABLE users (
user_id INT AUTO_INCREMENT,
username VARCHAR(50) NOT NULL, -- 关键约束
email VARCHAR(100),
PRIMARY KEY (user_id)
);
核心作用:强制字段必须包含值,NULL值会被拒绝。在用户注册场景中,用户名这类关键字段必须设为NOT NULL。
避坑指南:
- 与DEFAULT值联用时需谨慎:
NOT NULL DEFAULT ''和单纯的NOT NULL语义不同 - ALTER TABLE添加NOT NULL约束时,表中已有NULL记录会导致失败
- 使用
IS NULL查询时,空字符串''不等于NULL
2.2 唯一约束(UNIQUE)
复合唯一键实战案例:
sql复制CREATE TABLE product_sku (
product_id INT,
color_code VARCHAR(10),
size VARCHAR(5),
stock INT,
UNIQUE KEY (product_id, color_code, size) -- 组合唯一
);
性能影响:
- 唯一约束会自动创建唯一索引
- 大数据量时,唯一索引写入性能比普通索引低约15-20%
- 建议对查询频率高于修改频率的字段使用
2.3 主键约束(PRIMARY KEY)
自增主键的隐藏问题:
sql复制CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY, -- 典型设计
user_id INT NOT NULL,
amount DECIMAL(10,2)
);
-- 当达到INT上限时(约21亿),会报错"Duplicate entry"
