PostgreSQL自定义domain约束无法正确捕获空文本输入问题咨询
问题原因
PostgreSQL 对 domain 上定义的多个 CHECK 约束,不会按照约束的定义顺序执行校验,而是按照约束名称的字典序(ASCII 排序)依次校验,只要命中第一个不满足的约束就直接抛出错误,不会继续执行后续约束的校验。
你的四个约束按名称字典序排列后的校验顺序如下:
max_length:校验规则char_length(value) < 10min_length:校验规则char_length(value) > 1not_blank:校验规则char_length(value) > 0suggested_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
相关产品推荐
相关产品推荐

