1. 数据库约束的本质与价值
刚入行的开发同事老张最近踩了个坑——他们业务系统出现了大量脏数据:用户表里冒出一堆空手机号,订单表里出现了负数的金额,还有一堆重复的身份证号。排查到最后发现,这些本该在数据库层面就被拦截的非法数据,竟然全都成功写入了。问题的根源很简单:建表时没加约束。
数据库约束就像交通规则中的红绿灯,它能在数据写入前就进行合法性校验。我经手过的金融系统中,约束条件曾拦截过90%以上的异常数据。今天我们就深入聊聊MySQL中那些守护数据安全的"门神"们。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 六大约束类型详解
2.1 非空约束:数据完整性的第一道防线
创建用户表时最该先考虑的就是NOT NULL约束。去年我们系统升级时,就因漏掉这个约束导致用户注册流程崩溃:
sql复制CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL, -- 必须填写
phone CHAR(11) NOT NULL, -- 不允许NULL值
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
关键经验:所有业务关键字段都应设为NOT NULL。我们曾遇到DEFAULT NULL的字段被误认为有值,导致统计报表严重偏差。特别要注意的是,NOT NULL字段在INSERT时必须显式赋值或用DEFAULT约束。
2.2 唯一约束:杜绝重复数据的银弹
电商平台的SKU编码、用户的身份证号这些需要绝对唯一的字段,必须上UNIQUE约束。去年双十一大促时,有个商品因编码重复导致库存统计出错:
sql复制CREATE TABLE products (
id INT PRIMARY KEY,
sku_code VARCHAR(20) UNIQUE, -- 唯一索引
product_name VARCHAR(100)
);
-- 插入重复值会报错
INSERT INTO products VALUES(1, 'A001', '手机');
INSERT INTO products VALUES(2, 'A001', '耳机'); -- 报
