问题描述
右表:
Name | Cities
John |"NY","BOST","NJ"
Peter|"CHI","LA"
如何添加约束告诉我不想要:
Sam | "LA","LA"
代码示例
ALTER TABLE address
ADD CONSTRAINT "check_cities_are_not_duplicate"
CHECK (
Cities <> ...
);
解决方法
我会创建一个可以检查这个的函数:
create function check_duplicates (my_array text[])
returns boolean
language plpgsql
as
$$
declare
result boolean;
begin
SELECT cardinality(my_array) = cardinality(array_agg(DISTINCT u))
INTO result
FROM unnest(my_array) u;
RETURN result;
end;
$$;
基本上,该函数计算数组 (cardinality()
) 的元素并将其与以下内容进行比较:
-
unnest(array)
将数组元素展开为每个元素一行 -
array_agg(DISTINCT ...)
重新聚合,但忽略重复项 -
cardinality(...)
在这个新数组上
因此,如果原始数组和新创建的数组的元素个数不同,则该数组有重复元素。
此函数可用于检查约束:
CHECK(check_duplicates(cities))