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