1

有没有办法修改DOMAINPostgres 13.4中现有约束的细节?

我一直在尝试并检查文档,并怀疑答案是:“不DROP。约束(或域和约束?),并重建它。”

这很尴尬,因为我有已经使用约束的字段和函数,所以我还必须使用一些级联的项目DROP​​和CREATE. 我可以这样做,但它有点牵涉。

例如,我有一个简单的域列表,如下所示:

DROP DOMAIN IF EXISTS domains.user_name;

CREATE DOMAIN domains.user_name AS
    citext
    NOT NULL
    CONSTRAINT user_name_legal_values
        CHECK(
            VALUE IN (
                'postgres',
                'dbadmin',
                'user_bender',
                'user_cleanup',
                'user_domo_pull'
            )
     );

COMMENT ON DOMAIN domains.user_name IS
    'Valid user_name role names.';

我想通过再插入一个名称来更改VALUE IN列表: 。CHECK'user_analytics'

在不删除和重建域、约束或两者的情况下,这是否可能?

如果不是,我可以进行级联删除和重建,并为未来计算出DOMAIN不适合此类事情的工具。我总是可以使用一个小的查找表来代替。我只是喜欢DOMAIN它使参数和列的意图更清晰。

4

1 回答 1

0

使用ALTER DOMAIN. 删除旧约束并添加一个新约束。您不能在一个命令中同时执行这两项操作(与 不同ALTER TABLE):

ALTER DOMAIN user_name DROP CONSTRAINT user_name_legal_values;
ALTER DOMAIN user_name  ADD CONSTRAINT user_name_legal_values CHECK(
            VALUE IN (
                'postgres',
                'dbadmin',
                'user_analytics',
                'user_bender',
                'user_cleanup',
                'user_domo_pull'
            ));

手册:

ADD domain_constraint [ NOT VALID ]

这种形式使用与 CREATE DOMAIN. 将新约束添加到域时,将根据新添加的约束检查使用该域的所有列。[...]

由于您只允许附加值,因此现有列不会发生冲突。

于 2021-11-07T05:52:24.963 回答