2025/12/3

约束:
在 SQL 中,约束(Constraint) 是对表中字段数据的规则限制,用于保证数据的完整性、一致性和有效性(比如避免重复数据、防止非法值插入、确保关联数据合法等)。约束是表结构的一部分,定义时可直接跟字段关联,也可单独命名定义。
一、约束的核心作用
保证数据完整性:避免无效、错误或不合理的数据进入表中(如年龄不能为负数);
保证数据一致性:尤其是多表关联时(如订单表的用户 ID 必须在用户表中存在);
简化业务逻辑:无需通过代码额外校验,数据库层面直接拦截非法操作。
二、约束的分类及关键字(附作用 + 示例)
SQL 中常用约束分为 6 类,核心关键字和场景如下:
约束类型 关键字 核心作用 适用场景 示例(基于之前的user表)
主键约束 PRIMARY KEY(PK) 唯一标识表中每条记录,非空 + 唯一(一张表只能有 1 个主键,可多字段联合主键) 表的核心标识字段(如用户 ID、订单 ID) CREATE TABLE user ( id INT PRIMARY KEY, -- 单字段主键 name VARCHAR(50) );
联合主键:CREATE TABLE student_course ( student_id INT, course_id INT, PRIMARY KEY(student_id, course_id) );
非空约束 NOT NULL 限制字段必须输入值,不能为NULL 必填字段(如用户名、手机号) CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL -- 用户名不能为空 );
唯一约束 UNIQUE 限制字段值唯一(可多个NULL,因为NULL不参与唯一性比较) 需去重的非主键字段(如邮箱、手机号) CREATE TABLE user ( id INT PRIMARY KEY, email VARCHAR(100) UNIQUE -- 邮箱不能重复 );
外键约束 FOREIGN KEY(FK) 建立多表关联,保证从表字段值必须在主表对应的主键 / 唯一键中存在(父表限制子表) 多表关联场景(如订单表→用户表、课程表→学生表) 1. 主表(用户表):CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) );
2. 从表(订单表):CREATE TABLE order ( order_id INT PRIMARY KEY, user_id INT, -- 关联用户表的id FOREIGN KEY(user_id) REFERENCES user(id) -- 约束:user_id必须在user表的id中存在 );
检查约束 CHECK 限制字段值必须满足指定条件(如范围、格式等) 需自定义规则的字段(如年龄、分数) CREATE TABLE user ( id INT PRIMARY KEY, age TINYINT CHECK(age > 0 AND age <= 120), -- 年龄必须0-120分 score INT CHECK(score BETWEEN 0 AND 100) -- 分数0-100 );
默认值约束 DEFAULT 字段未输入值时,自动填充默认值(NULL不属于 “输入值”) 非必填但有默认值的字段(如性别、状态) CREATE TABLE user ( id INT PRIMARY KEY, gender CHAR(1) DEFAULT '男', -- 默认性别为男 status TINYINT DEFAULT 1 -- 默认状态为“正常” );
三、补充说明(关键细节)

  1. 主键约束 vs 唯一约束(易混淆点)
    对比维度 主键约束(PRIMARY KEY) 唯一约束(UNIQUE)
    非空要求 必须非空 允许为NULL(可多个)
    表中数量 只能有 1 个(可联合主键) 可以有多个
    索引特性 自动创建聚簇索引 自动创建非聚簇索引
    核心用途 标识记录唯一性(主键) 限制字段重复(非主键)
  2. 外键约束的 “级联操作”(可选)
    定义外键时,可指定主表记录被修改 / 删除时,从表的处理规则(避免外键冲突),关键字:
    ON DELETE CASCADE:主表记录删除时,从表关联记录同步删除(如删除用户,同步删除其所有订单);
    ON UPDATE CASCADE:主表主键更新时,从表关联字段同步更新;
    ON DELETE SET NULL:主表记录删除时,从表关联字段设为NULL(需确保从表字段允许NULL)。
    示例(级联删除):
    sql
    CREATE TABLE order (
    order_id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE -- 删除用户,同步删除订单
    );
  3. 约束的 “命名”(可选)
    默认情况下,数据库会自动给约束命名(如PRIMARY、UNIQUE_KEY_1),也可手动命名(方便后续修改 / 删除约束),语法:
    sql
    CREATE TABLE user (
    id INT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    -- 手动命名约束
    CONSTRAINT pk_user_id PRIMARY KEY(id),
    CONSTRAINT uk_user_email UNIQUE(email),
    CONSTRAINT chk_user_name CHECK(LENGTH(name) >= 2)
    );
  4. 约束的 “添加 / 删除”(ALTER TABLE)
    已创建的表,可通过ALTER TABLE添加或删除约束:
    添加约束:ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(字段);
    示例:给user表的phone字段添加唯一约束
    ALTER TABLE user ADD CONSTRAINT uk_user_phone UNIQUE(phone);
    删除约束:ALTER TABLE 表名 DROP CONSTRAINT 约束名;
    示例:删除uk_user_email约束
    ALTER TABLE user DROP CONSTRAINT uk_user_email;
    四、约束使用优先级建议
    优先定义PRIMARY KEY:确保表中记录唯一可标识;
    关键字段加NOT NULL:避免必填字段为空;
    需去重的字段加UNIQUE:如邮箱、手机号;
    多表关联必加FOREIGN KEY:保证关联数据一致性;
    自定义规则加CHECK:如数值范围、格式校验;
    非必填字段加DEFAULT:简化插入操作。

posted on 2025-12-01 20:27  才一斤  阅读(0)  评论(0)    收藏  举报

导航