做软件设计师检查约束空值练习时,CHECK (fee > 0)允许显式写入 NULL。比较结果是未知值,检查约束只拒绝结果为假的记录。如果每条记录都要有金额,还要在字段上声明 NOT NULL。知英教育建议先把取值范围和是否必填分别写下来。
先计算表达式,再判断这一行
按 PostgreSQL 18 的CHECK约束通过条件,表达式结果为真或空值时可通过,结果为假时拒绝。比较运算 NULL > 0 得到空值,在三值逻辑中表示未知。
CREATE TABLE practice_offer (
fee numeric CHECK (fee > 0)
);
在这个自编练习中,分别试三个输入:25 的检查结果为真,可以写入;−1 的结果为假,会被拒绝;显式写入 NULL 得到未知值,可以通过这条检查。复核CHECK约束通过条件时,先算表达式,再区分这三种结果。

正数范围和必填要求分别声明
分析软件设计师检查约束空值的题目,先读字段允许怎样缺省。报价尚未确定时,可以允许该字段为空,已填写的值则必须为正。如果要求每条记录必填,就在建表时使用 fee numeric NOT NULL CHECK (fee > 0)。
这一步是非空约束的单独判断。空值由 NOT NULL 拒绝;负数虽有值,仍会被 CHECK 拒绝。知英教育建议把两种失败分别写出原因,便于发现遗漏的约束。

按付款状态决定金额是否必填
假设订单草稿可以暂留空金额,标记为已付款时必须有金额。练习表可以写成 CREATE TABLE fee_by_status (paid boolean NOT NULL, fee numeric CHECK (fee > 0), CHECK (NOT paid OR fee IS NOT NULL))。每次单独执行一条插入语句,方便判断是哪组数据触发了错误。
依次试填 (FALSE, NULL)、(TRUE, NULL)、(TRUE, 0) 和 (TRUE, 25)。第一组可以保存。第二组的状态检查得出 FALSE,第三组的金额检查得出 FALSE,第四组满足两项检查。再尝试把第一组数据的 paid 改为 TRUE,更新也会失败,原行仍是未付款状态。
若把状态检查写成 CHECK (NOT paid OR fee > 0),已付款且金额为 NULL 时,括号里的结果是 FALSE OR UNKNOWN,得到 UNKNOWN。这组输入可以用来查出有条件的必填规则是否写漏了空值判断。
用三组输入核对建表意图
测试时分别提交 25、−1 和显式的 NULL,记录成功或失败以及对应规则。省略字段时还要看默认值,本例只比较明确给出的值。对已有表增加必填要求时,先检查存量空值并按实际业务处理。
非空约束的单独判断还可以用查询验证。查找已有缺失值用 fee IS NULL,查询条件与写入约束各有各的作用。

复习软件设计师检查约束空值时,先说清CHECK约束通过条件,再做非空约束的单独判断。若仍分不清三种输入的去向,可向知英教育咨询自己的建表和推导步骤。本文算例限定在 PostgreSQL 18。

