Database 向带有签入Postgres的表添加约束

Database 向带有签入Postgres的表添加约束,database,postgresql,database-design,constraints,Database,Postgresql,Database Design,Constraints,我想通过向特定列添加约束来修改现有表,以尊重某些正则表达式 我尝试通过执行以下命令来规范电话前缀号码: ALTER TABLE users ADD CONSTRAINT users_prefix_constraint CHECK (users.phone_prefix ~ '^\+\d{1,3}$'); 而且它工作正常 但我想更通用地使用它,并定义保存正则表达式模式的域,以便在不同的地方(即触发器中)使用相同的模式。这就是为什么我想做这样的事情: CREATE DOM

我想通过向特定列添加约束来修改现有表,以尊重某些正则表达式

我尝试通过执行以下命令来规范电话前缀号码:

ALTER TABLE users
    ADD CONSTRAINT users_prefix_constraint 
        CHECK (users.phone_prefix ~ '^\+\d{1,3}$');
而且它工作正常

但我想更通用地使用它,并定义保存正则表达式模式的域,以便在不同的地方(即触发器中)使用相同的模式。这就是为什么我想做这样的事情:

CREATE DOMAIN ph_prefix AS TEXT CHECK (VALUE ~'^\+\d{1,3}$');

ADD CONSTRAINT users_prefix_constraint CHECK (users.phone_prefix :: ph_prefix);
这里的问题是,CHECK部分需要一些返回布尔值的函数,而casting不需要

有办法吗? 这是定义约束的好方法吗?也许这不是首选的方式。
我认为你没有抓住域名的重点

您不会将域添加为约束,但会将其用作列的数据类型:

ALTER TABLE users ALTER phone_prefix TYPE ph_prefix;

我认为你没有抓住域名的重点

您不会将域添加为约束,但会将其用作列的数据类型:

ALTER TABLE users ALTER phone_prefix TYPE ph_prefix;

如果您有理由定义域,但不将其用作users.phone\u prefix列的数据类型,则创建此简单函数

创建或替换函数ph_prefix_valids text返回布尔值作为 $$ 开始 执行s::ph_前缀; 返回true; 当其他人 返回false; 终止 $$语言plpgsql; 然后

添加约束用户\u前缀\u约束检查ph\u前缀\u validusers.phone\u前缀;
如果您有理由定义域,但不将其用作users.phone\u prefix列的数据类型,则创建此简单函数

创建或替换函数ph_prefix_valids text返回布尔值作为 $$ 开始 执行s::ph_前缀; 返回true; 当其他人 返回false; 终止 $$语言plpgsql; 然后

添加约束用户\u前缀\u约束检查ph\u前缀\u validusers.phone\u前缀;
非常感谢。我错过了最清晰的解决方案。谢谢。我错过了最清楚的解决办法。