展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 数据库 > SQL CHECK约束的用法与取值范围限制

SQL CHECK约束的用法与取值范围限制

SQLPro
SQLPro

SQLPro 是一款macOS平台上数据库管理应用,避免使用非法,享受更全面的支持和更新。它更贴近日常 macOS 使用场景,处理高频操作时整体会更顺手一些。

¥119
macOS 2026-09-24
正版软件 macOS软件 数据库管理工具 macOS
立即下载

深入理解 SQL CHECK 约束在 PostgreSQL、MySQL 等数据库中的实现差异。文章通过订单业务场景,讲解如何定义单列范围与多列逻辑约束,分析 NULL 值对布尔条件的影响,并提供修改已有表结构时的安全操作建议,帮助开发者构建更健壮的数据完整性防线。

本文目录

    在业务开发中,仅靠应用层代码校验数据往往不够可靠。如果接口被绕过或代码出现逻辑漏洞,数据库中就可能存入非法的状态码或超出范围的数值。CHECK 约束是数据库层面最后一道防线,它要求每条插入或更新的记录必须满足指定的布尔条件,否则直接拒绝操作。

    先复现:不加 CHECK 会发生什么

    假设我们有一张订单表 orders,其中 status 字段只允许 'pending'(待处理)、'paid'(已支付)和 'cancelled'(已取消),discount_rate(折扣率)必须在 0 到 1 之间。如果没有数据库约束,仅靠后端枚举判断,一旦有人直接连接数据库或通过未校验的脚本写入数据,就会出现脏数据。

    例如,执行以下插入语句:

    INSERT INTO orders (order_id, status, discount_rate)
    VALUES (1001, 'shipped', 1.5);
    

    在没有任何约束的情况下,这条记录会成功入库。status 变成了业务未定义的 'shipped',discount_rate 超过了 100%。这种数据污染会导致后续统计报表错误,甚至引发线上故障。

    SQL CHECK约束的用法与取值范围限制

    CHECK 条件不满足时 INSERT 被拒绝

    如上图所示,当引入 CHECK 约束后,同样的非法插入操作会被数据库引擎拦截,并返回明确的约束违反错误。这确保了无论数据来自哪个入口,只要不符合规则就无法落地。

    列级与表级 CHECK 的写法

    CHECK 约束可以定义在单个列上,也可以定义在表级别以引用多个列。

    列级约束:限制单列范围

    在建表时,可以直接在列定义后添加 CHECK 子句。这种方式适合简单的范围限制或枚举值检查。

    CREATE TABLE orders (
        order_id SERIAL PRIMARY KEY,
        status VARCHAR(20) CHECK (status IN ('pending', 'paid', 'cancelled')),
        discount_rate NUMERIC(5, 4) CHECK (discount_rate >= 0 AND discount_rate <= 1),
        created_at TIMESTAMP DEFAULT NOW()
    );
    

    这里 status 只能取指定的三个值之一,discount_rate 被限制在 [0, 1] 区间内。如果插入 discount_rate = 1.2,数据库会抛出错误。

    表级约束:表达跨列逻辑

    当约束条件涉及两个或多个列时,必须使用表级约束。例如,要求订单的 start_at 时间不能晚于 end_at 时间。

    CREATE TABLE promotions (
        promo_id SERIAL PRIMARY KEY,
        start_at TIMESTAMP NOT NULL,
        end_at TIMESTAMP NOT NULL,
        CONSTRAINT chk_time_range CHECK (start_at <= end_at)
    );
    

    注意,表级约束通常使用 CONSTRAINT 名称 CHECK (...) 的格式,这样在报错时能明确指出是哪个约束失败,便于排查。

    SQL CHECK约束的用法与取值范围限制

    从单列范围到跨列条件并区分 NULL

    上图展示了列级约束与表级约束的区别,以及 NULL 值在约束判断中的特殊路径。可以看到,单列约束直接作用于字段值,而表级约束则评估行内多个字段的逻辑关系。

    NULL、已有数据与 ALTER TABLE 的坑

    在使用 CHECK 约束时,NULL 值的处理和已有数据的校验是两个常见的陷阱。

    UNKNOWN 与 NOT NULL 的关系

    在 SQL 标准中,CHECK 约束的条件计算结果有三种可能:TRUE、FALSE 和 UNKNOWN(通常为 NULL 参与运算的结果)。只有当结果为 FALSE 时,约束才会被违反并拒绝操作;如果结果为 TRUE 或 UNKNOWN,操作都会被允许。

    这意味着,如果你定义 CHECK (discount_rate > 0),插入 NULL 是允许的,因为 NULL > 0 的结果是 UNKNOWN,而非 FALSE。如果业务要求该字段必填且大于 0,必须同时加上 NOT NULL 约束:

    discount_rate NUMERIC(5, 4) NOT NULL CHECK (discount_rate > 0)
    

    添加约束前检查历史数据

    对于已经存在的表,使用 ALTER TABLE 添加 CHECK 约束时,数据库默认会扫描全表验证现有数据是否满足新约束。如果存在脏数据,添加操作会失败。

    -- PostgreSQL 和 SQL Server 支持在添加时选择是否验证已有数据
    ALTER TABLE orders 
    ADD CONSTRAINT chk_discount_valid 
    CHECK (discount_rate BETWEEN 0 AND 1);
    

    在 PostgreSQL 中,可以使用 NOT VALID 选项跳过对已有数据的检查,仅对新插入或更新的数据生效,随后再异步验证旧数据。而在 MySQL 8.0.16 之前,CHECK 约束会被解析但忽略,8.0.16 之后才正式支持并强制校验。SQLite 则在创建表时支持,但在某些 ALTER TABLE 操作中支持有限。因此,在执行变更前,务必先查询确认历史数据的合规性:

    SELECT COUNT(*) FROM orders WHERE discount_rate < 0 OR discount_rate > 1;
    

    如果计数不为 0,需要先清洗数据或修正异常记录,再添加约束。

    确定边界:CHECK 何时不够用

    虽然 CHECK 约束非常有用,但它并非万能。它主要适用于单行内的静态规则。以下场景应考虑其他方案:

    1. 跨表引用:CHECK 约束通常不能引用其他表的数据(部分数据库如 PostgreSQL 支持函数调用间接实现,但不推荐)。如果需要确保外键关联的有效性,应使用 FOREIGN KEY 约束。
    2. 动态规则:如果规则依赖于配置表或频繁变化的业务参数,硬编码在 CHECK 中会导致维护困难。此时应在应用层或使用触发器(Trigger)处理。
    3. 复杂业务流程:涉及多步事务或状态机流转的逻辑,单纯的值域检查无法覆盖状态转换的合法性,需由应用服务层控制。

    在迁移落地时,建议先在测试环境模拟全量数据校验,确认约束不会阻断正常业务流。对于核心业务表,CHECK 约束是提升数据质量的低成本高收益手段,值得优先实施。

    参考资料

    • PostgreSQL CHECK constraints
    • MySQL CHECK constraints
    • SQL Server CHECK constraints
    • SQLite CREATE TABLE constraints
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    数据库 MySQL SQL postgresql sql 约束
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?