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;但报错:
cannot use subquery in check constraint (SQLSTATE 0A000)
解决方案
PostgreSQL的CHECK约束不支持包含子查询,需换用其他方式实现,以下是两种可行方案:
方案1:使用内置数组函数实现
利用ALL()结合布尔数组检查所有元素长度,无需子查询:
ALTER TABLE "tableA" ADD CONSTRAINT "colA_text_size" CHECK (ALL (ARRAY(SELECT length(pc) <= 100 FROM unnest(colA) pc))) NOT VALID; ALTER TABLE "tableA" VALIDATE CONSTRAINT "colA_text_size";
或更简洁的every()函数写法:
ALTER TABLE "tableA" ADD CONSTRAINT "colA_text_size" CHECK (every(length(elem) <= 100) FOR colA) NOT VALID; ALTER TABLE "tableA" VALIDATE CONSTRAINT "colA_text_size";
方案2:通过自定义函数实现约束
如果需要灵活处理特殊场景(比如空元素),可先创建验证函数:
CREATE OR REPLACE FUNCTION validate_array_text_length(arr varchar[], max_len int) RETURNS boolean AS $$ BEGIN FOREACH elem IN ARRAY arr LOOP IF length(elem) > max_len THEN RETURN false; END IF; END LOOP; RETURN true; END; $$ LANGUAGE plpgsql IMMUTABLE;
再用该函数添加CHECK约束:
ALTER TABLE "tableA" ADD CONSTRAINT "colA_text_size" CHECK (validate_array_text_length(colA, 100)) NOT VALID; ALTER TABLE "tableA" VALIDATE CONSTRAINT "colA_text_size";
内容的提问来源于stack exchange,提问作者PavelA
相关产品推荐
相关产品推荐

