在设计数据库时,经常会遇到用户输入错误、重复提交或者漏填信息的情况。比如一个注册系统,如果允许两个人用同一个邮箱注册,那后续的登录和通知就会乱套。这时候,SQL约束就派上用场了——它像是一道道规则门槛,确保存进数据库的数据是合法、完整且一致的。
主键约束(PRIMARY KEY)
主键用来唯一标识一条记录。比如每个用户都有一个唯一的ID,这个ID不能重复,也不能为空。设置了主键后,数据库会自动拒绝插入重复或NULL值。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
非空约束(NOT NULL)
有些字段必须填写,比如注册时的手机号。通过NOT NULL约束,可以防止该字段被留空。
CREATE TABLE profiles (
phone VARCHAR(15) NOT NULL,
nickname VARCHAR(30)
);
唯一约束(UNIQUE)
和主键类似,但允许有多个唯一约束,并且可以包含一个NULL值(不同数据库处理方式略有差异)。常用于限制邮箱、身份证号这类不能重复的信息。
CREATE TABLE accounts (
email VARCHAR(100) UNIQUE,
username VARCHAR(50)
);
外键约束(FOREIGN KEY)
用来建立表与表之间的关联。比如订单表中的用户ID必须存在于用户表中,否则就是无效订单。外键能防止“孤儿记录”的出现。
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
检查约束(CHECK)
设定字段的取值范围。例如年龄不能为负数,性别只能是“男”或“女”。CHECK约束会在写入时验证条件是否满足。
CREATE TABLE students (
age INT CHECK (age >= 0),
gender VARCHAR(10) CHECK (gender IN ('男', '女'))
);
默认值约束(DEFAULT)
当没有提供值时,自动填充默认内容。比如用户注册时未选择城市,默认设为“未知”,避免字段为空带来的处理麻烦。
CREATE TABLE logs (
login_time DATETIME DEFAULT CURRENT_TIMESTAMP,
location VARCHAR(50) DEFAULT '未知'
);
这些约束不是可有可无的装饰,而是保障数据质量的核心机制。实际开发中,很多人图省事跳过约束设置,结果后期查数据对不上、程序报错不断。提前加好约束,等于给数据库穿上防弹衣,哪怕前端出点小问题,底层数据依然稳得住。