【问题标题】:ALTERing a CHECK constraint in a DOMAIN更改 DOMAIN 中的 CHECK 约束
【发布时间】:2021-12-20 10:16:15
【问题描述】:

有没有办法修改 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 不适合这种事情的未来。我总是可以使用一个小的查找表来代替。我只是喜欢DOMAIN,因为它使参数和列的意图更加清晰。

【问题讨论】:

    标签: postgresql constraints ddl sql-domain


    【解决方案1】:

    使用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 ]

    此表单使用与以下相同的语法向域添加新约束 CREATE DOMAIN。当一个新的约束被添加到一个域时,所有 将根据新添加的域检查使用该域的列 约束。 [...]

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

    【讨论】:

    • 太棒了!没看说明书。并且比我的 300 多行脚本重新键入列、删除函数、视图和域、重新键入列然后添加回函数和视图要好得多。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2022-01-11
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多