数据库约束是关系型数据库中确保数据完整性和一致性的重要机制,它们通过定义规则来限制表中数据的取值范围、格式或关联关系,从而防止无效或错误数据的插入、更新或删除,合理使用数据库约束能够显著提升数据质量,减少应用程序层的校验逻辑,以下是几种常见约束的写法及其应用场景。

主键约束(PRIMARY KEY)
主键约束用于唯一标识表中的每一行记录,其值必须唯一且不能为空,每个表只能有一个主键,但可以由多个列组合而成(复合主键),在创建表时定义主键的语法如下:
CREATE TABLE 表名 (
列名1 数据类型 PRIMARY KEY,
列名2 数据类型,
...
);
若需修改已存在的表添加主键,可使用:
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
用户表中的user_id通常作为主键:
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
AUTO_INCREMENT(MySQL)或IDENTITY(SQL Server)可自动生成唯一递增的数值。
唯一约束(UNIQUE)
唯一约束确保某列或列组合的值在表中唯一,但允许有空值(空值不参与唯一性比较),一个表可定义多个唯一约束,语法与主键类似:
CREATE TABLE 表名 (
列名1 数据类型,
列名2 数据类型 UNIQUE,
...
);
或通过ALTER TABLE添加:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名);
邮箱地址通常需要唯一:
CREATE TABLE users (
user_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
非空约束(NOT NULL)
非空约束强制列必须包含值,不允许为空,可在创建表时直接定义列的NOT NULL属性:
CREATE TABLE 表名 (
列名 数据类型 NOT NULL,
...
);
或修改表结构:

ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
用户名通常不能为空:
CREATE TABLE users (
username VARCHAR(50) NOT NULL
);
默认约束(DEFAULT)
默认约束为列指定默认值,当插入数据时未提供该列的值,则自动使用默认值,语法如下:
CREATE TABLE 表名 (
列名 数据类型 DEFAULT 默认值,
...
);
或通过ALTER TABLE添加:
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
用户注册时间默认为当前时间:
CREATE TABLE users (
register_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
检查约束(CHECK)
检查约束用于限制列的值必须满足特定条件,例如年龄必须大于0,语法如下:
CREATE TABLE 表名 (
列名 数据类型 CHECK (条件表达式),
...
);
或添加命名检查约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK (条件);
年龄范围限制:
CREATE TABLE users (
age INT CHECK (age > 0 AND age <= 120)
);
外键约束(FOREIGN KEY)
外键约束用于建立两个表之间的关联关系,确保子表(从表)的引用列值在父表(主表)的列中存在,或为空,语法如下:
CREATE TABLE 子表 (
列名 数据类型,
FOREIGN KEY (列名) REFERENCES 父表(列名)
);
或通过ALTER TABLE添加:

ALTER TABLE 子表 ADD CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 父表(列名);
订单表引用用户表:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
外键还可定义ON DELETE和ON UPDATE动作(如CASCADE、SET NULL)来处理级联操作。
数据库约束是保障数据可靠性的基石,开发者应根据业务需求合理选择约束类型,主键和唯一约束维护唯一性,非空约束确保必填字段,默认约束简化数据插入,检查约束限制数据范围,外键约束维护表间关联,在定义约束时,需注意性能影响,例如外键约束可能降低写入速度,但能显著减少数据不一致问题。
相关问答FAQs
Q1: 主键约束和唯一约束有什么区别?
A1: 主键约束(PRIMARY KEY)要求列值唯一且不能为空,每个表只能有一个主键;而唯一约束(UNIQUE)仅要求值唯一,允许有空值,且一个表可定义多个唯一约束,主键通常用于标识记录,而唯一约束常用于业务上需要唯一标识的字段(如邮箱、身份证号)。
Q2: 如何删除或修改已存在的约束?
A2: 删除约束需通过ALTER TABLE语句,语法为ALTER TABLE 表名 DROP CONSTRAINT 约束名(MySQL中主键约束为DROP PRIMARY KEY),修改约束通常需先删除旧约束,再添加新约束,修改列的非空约束需先删除NOT NULL(若存在),再重新添加:
ALTER TABLE 表名 MODIFY 列名 数据类型 NULL; -- 删除NOT NULL ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL; -- 添加NOT NULL