将数组值限制为允许的值集

And*_*eKR 5 postgresql array check-constraints

我想设置一个 CHECK 约束来确保text[]列的元素仅包含某些值。

设置一个例子:

CREATE TABLE foo(
  countries text[]
);

INSERT INTO foo VALUES ('{"Morocco", "Mali", "Indonesia"}');
INSERT INTO foo VALUES ('{"Sokovia", "Mali"}');
Run Code Online (Sandbox Code Playgroud)

现在只允许“摩洛哥”、“马里”和“印度尼西亚”,因此第二行应该被约束拒绝。

我有一个“有效”的解决方案:

CHECK (array_length(
  array_remove(
    array_remove(
      array_remove(
        countries,
        'Indonesia'
      ), 'Mali'
    ), 'Morocco'
  ), 1) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但这不太可读。

我也尝试过这个:

CHECK ((
  SELECT unnest(countries)
  EXCEPT
  SELECT unnest(array['Morocco', 'Mali', 'Indonesia'])
) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但:

错误无法在检查约束中使用子查询

Lau*_*lbe 3

在检查约束中使用“包含于”运算符:

CHECK (countries <@ ARRAY['Morocco', 'Mali', 'Indonesia'])
Run Code Online (Sandbox Code Playgroud)