SQL 约束
约束是作用于表中字段上的规则,用于限制存储在表中的数据;目的是保证数据库中数据的正确、有效性和完整性。 约束可以在创建表 / 修改表时添加。
一、约束分类
| 约束 | 描述 | 关键字 |
|---|---|---|
| 非空约束 | 限制该字段的数据不能为 null | NOT NULL |
| 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束 | 保证字段值满足某一个条件(8.0.16 版本之后) | CHECK |
| 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
主键自增用
AUTO_INCREMENT(与PRIMARY KEY搭配)。
二、约束演示
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',
name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',
age INT CHECK (age > 0 && age < 120) COMMENT '年龄',
status CHAR(1) DEFAULT 1 COMMENT '状态',
gender CHAR(1) COMMENT '性别'
) COMMENT '用户表';
插入数据验证各约束:
-- 正常插入
INSERT INTO user(name, age, status, gender) VALUES ('Tom', 18, '0', '男'), ('Tom2', 15, '0', '男');
-- 报错:姓名重复,违反唯一约束
INSERT INTO user(name, age, status, gender) VALUES ('Tom3', 15, '0', '男');
-- 报错:姓名为 null,违反非空约束
INSERT INTO user(name, age, status, gender) VALUES (null, 15, '0', '男');
-- 报错:年龄为 -1,违反检查约束
INSERT INTO user(name, age, status, gender) VALUES ('Tom4', -1, '0', '男');
-- 成功:未指定 status,取默认值 1
INSERT INTO user(name, age, gender) VALUES ('Tom5', 80, '男');
违反约束时 INSERT 直接报错,数据不会写入。
三、案例:按需求建表
| 字段名 | 字段含义 | 字段类型 | 约束条件 | 约束关键字 |
|---|---|---|---|---|
| id | ID 唯一标识 | int | 主键,并且自动增长 | PRIMARY KEY, AUTO_INCREMENT |
| name | 姓名 | varchar(10) | 不为空,并且唯一 | NOT NULL, UNIQUE |
| age | 年龄 | int | 大于 0,并且小于等于 120 | CHECK |
| status | 状态 | char(1) | 如果没有指定该值,默认为 1 | DEFAULT |
| gender | 性别 | char(1) | 无 | — |
CREATE TABLE tb_user(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',
age INT CHECK (age > 0 && age <= 120) COMMENT '年龄',
status CHAR(1) DEFAULT '1' COMMENT '状态',
gender CHAR(1) COMMENT '性别'
);
四、速查
字段 类型 NOT NULL -- 非空
字段 类型 UNIQUE -- 唯一
字段 类型 PRIMARY KEY [AUTO_INCREMENT] -- 主键(+ 自增)
字段 类型 DEFAULT 默认值 -- 默认
字段 类型 CHECK (条件) -- 检查
相关
- SQL 外键约束:外键语法与删除/更新行为
- SQL - DDL:建表、改表语句
- MySQL 数据类型:数值 / 字符串 / 日期时间