You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL自定义domain约束无法正确捕获空文本输入问题咨询

问题原因

PostgreSQL 对 domain 上定义的多个 CHECK 约束,不会按照约束的定义顺序执行校验,而是按照约束名称的字典序(ASCII 排序)依次校验,只要命中第一个不满足的约束就直接抛出错误,不会继续执行后续约束的校验。

你的四个约束按名称字典序排列后的校验顺序如下:

  1. max_length:校验规则 char_length(value) < 10
  2. min_length:校验规则 char_length(value) > 1
  3. not_blank:校验规则 char_length(value) > 0
  4. suggested_length:校验规则 char_length(value) < 8

对应空字符串''的校验过程:

  • 首先校验max_length,空字符串长度为0,满足0 < 10,校验通过
  • 接下来校验min_length,空字符串长度0不满足> 1的规则,直接抛出min_length约束错误,根本不会执行后续not_blank的校验,因此你看不到not_blank的触发提示。

如果你需要让not_blank约束优先触发

可以调整约束名称,让它的字典序排在min_length之前即可,比如按序号前缀命名约束:

create domain foo as text                                                   
     constraint chk_01_not_blank check (char_length(value) > 0)                      
     constraint chk_02_min_length check (char_length(value) > 1)               
     constraint chk_03_suggested_length check (char_length(value) < 8)                                                                                                                                                   
     constraint chk_04_max_length check (char_length(value) < 10);

调整后校验顺序会按照你预设的逻辑执行,空字符串会优先命中chk_01_not_blank约束。

内容的提问来源于stack exchange,提问作者francistheturd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:57:04