创建自定义域的数组postgres[英] Create array of custom domain postgres

本文是小编为大家收集整理的关于创建自定义域的数组postgres的处理方法,想解了创建自定义域的数组postgres的问题怎么解决?创建自定义域的数组postgres问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

由于枚举的继承限制(您无法从函数内部添加值向枚举添加值),因此我要切换到具有检查验证值的自定义域.我需要能够创建自定义枚举的数组,但是当我尝试这样的事情时:

CREATE DOMAIN foo AS text CHECK (VALUE IN ('foo', 'bar'));
CREATE TABLE foo_table(foo_column foo[]);

我得到错误

type "foo[]" does not exist

做一些谷歌搜索,我找到了使它看起来像是来了.有办法做到吗?

谢谢!

更新

我想出了一个骇人听闻的解决方案,如果没有人在几天内提出更好的解决方案,我将作为答案.该解决方案意味着您不能重复使用类型为数组,必须创建一个单独的类型,该类型用作数组:

CREATE DOMAIN foo_group AS text[] CHECK (VALUE <@ ARRAY['foo', 'bar']);

CREATE TABLE foo_table(foo_column foo_group);

以下工作:

INSERT INTO foo_table VALUES(ARRAY['foo']);
INSERT INTO foo_table VALUES(ARRAY['foo', 'bar']);
INSERT INTO foo_table VALUES(ARRAY['bar']);

以下没有:

INSERT INTO foo_table VALUES(ARRAY['foo', 'baz']);
INSERT INTO foo_table VALUES(ARRAY['baz']);

推荐答案

另一个可能的解决方法是:

CREATE TYPE foo_tup AS (item foo);

类型可以包裹在这样的元组中,这为您提供了一个数组构造函数.不利的一面是您可能要创建演员:

select array[row('foo')::foo_tup, row('bar')];

例如,您可以创建一个函数和铸件:

create function foo_tup(foo) returns foo_tup language sql as $$
    select row($1)::foo_tup;
$$ immutable;
create function foo(foo_tup) returns foo language sql as $$
     select $1.item;
$$;
create cast (foo as foo_tup) with function foo_tup(foo);
create cast (foo_tup as foo) with function foo(foo_tup);

然后聚集变得容易:

select array_agg(myfoo::foo_tup) from my_table; 

尽管您得到了额外的括号.

本文地址:https://www.itbaoku.cn/post/1763764.html