更改域中的 CHECK 约束

ALTERing a CHECK constraint in a DOMAIN

有没有办法修改 Postgres 13.4 中现有DOMAIN 约束的详细信息?

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

这很尴尬,因为我有一些字段和函数已经使用了约束,所以我还需要 DROPCREATE 一些级联的项目​​。我可以做到,但是有点牵强。

例如,我有一个像这样的简单域列表:

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.';

我想更改 CHECK 中的 VALUE IN 列表,方法是再插入一个名称:'user_analytics'.

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

如果不是,我可以执行级联删除和重建,并为将来设想 DOMAIN 不是处理此类事情的正确工具。我总是可以使用一个微小的查找 table 来代替。我只是喜欢 DOMAIN,因为它使参数和列的意图更加清晰。

使用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'
            ));

The manual:

ADD domain_constraint [ NOT VALID ]

This form adds a new constraint to a domain using the same syntax as CREATE DOMAIN. When a new constraint is added to a domain, all columns using that domain will be checked against the newly added constraint. [...]

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