如何限制PostgreSQL中数组文本对象的长度?

15 浏览
0 Comments

如何限制PostgreSQL中数组文本对象的长度?

有没有办法在一个数组列上添加约束来限制文本对象的长度?

我知道我可以在没有约束的情况下这样做:

colA varchar(100)[] not null

我尝试以以下方式进行:

alter table "tableA" ADD CONSTRAINT "colA_text_size"
    CHECK ((SELECT max(length(pc)) from unnest(colA) as pc) <= 100) NOT VALID;
alter table "tableA" VALIDATE CONSTRAINT colA_text_size;

但是出现错误:无法在检查约束中使用子查询 (SQLSTATE 0A000)

0
0 Comments

问题的原因是,原始的解决方案array_to_string(text_array, '')不能按照要求对每个数组元素进行检查,而是对数组中所有文本的字符数进行计数,并将其与限制值进行比较。因此,需要找到一种方法来检查每个数组元素的长度,并将其与限制值进行比较。

解决方法是使用以下定义的检查约束:

check (length(replace(array_to_string( text_array ,','), ',','')) <= 100)

该解决方法的步骤如下:

1. 首先,函数array_to_string( ... )将数组转换为逗号分隔的字符串。

2. 然后,replace()函数将逗号替换为空字符串''。

3. length()函数获取字符串中剩余字符的数量。

4. 最后,将该数量与限制值(100)进行比较,并将check约束通过或失败。

通过上述解决方法,可以实现对每个数组元素的长度进行检查,并将其与限制值进行比较。

参考资料:

- array_to_string()

- replace(), length()

需要注意的是,为什么不直接使用array_to_string(text_array, '')而添加逗号后再删除逗号?这是因为直接使用array_to_string(text_array, '')无法满足原始问题的要求。它将计算数组中所有文本的字符数,并将其与限制值进行比较,而不是对每个数组元素进行单独的检查。因此,需要使用上述解决方法来实现对每个数组元素长度的检查。

0