我想设置一个 CHECK 约束,以确保text[]
列的元素仅包含某些值。
设置示例:
CREATE TABLE foo(
countries text[]
);
INSERT INTO foo VALUES ('{"Morocco", "Mali", "Indonesia"}');
INSERT INTO foo VALUES ('{"Sokovia", "Mali"}');
现在应该只允许“摩洛哥”、“马里”和“印度尼西亚”,所以第二行应该被约束拒绝。
我有一个“有效”的解决方案:
CHECK (array_length(
array_remove(
array_remove(
array_remove(
countries,
'Indonesia'
), 'Mali'
), 'Morocco'
), 1) IS NULL)
但这不是很可读。
我也试过这个:
CHECK ((
SELECT unnest(countries)
EXCEPT
SELECT unnest(array['Morocco', 'Mali', 'Indonesia'])
) IS NULL)
但:
错误不能在检查约束中使用子查询
在检查约束中使用“包含在”运算符: