我想在下面的postgres表上设置一个检查约束:
CREATE TABLE foo ( id int Primary Key,names varchar(40)[] );
由于names是一个数组,因此我无法定义对数组中每个元素的检查.
以下约束是我最好的猜测(不工作):
ALTER TABLE foo ADD CONSTRAINT check_names CHECK (ALL(names[]) ~* '^[A-Z]') ;
基本上,名称[]的每个元素都应该只用大写字母组成.
解决方法
就像pozs评论你的帖子一样,就我所知,你不能把这样的CHECK约束放在一个数组上(真正的专业人士可能会在这里纠正我).
你可以做的是写一个BEFORE INSERT触发器,它在名字字段插入表格之前检查它的值.实际上就像CONSTRAINT一样.显然,这不适用于表中已有的行.
CREATE FUNCTION all_caps_array_only() RETURNS trigger AS $$ DECLARE name varchar(40); BEGIN FOREACH name IN ARRAY NEW.names LOOP IF name !~ '[A-Z]+' THEN RETURN NULL; -- Fail the INSERT END IF; END LOOP; RETURN NEW; -- Make the INSERT happen END; $$LANGUAGE plpgsql;