通过检查 Postgres 向表添加约束

时间:2021-02-16 13:18:12

标签: database postgresql database-design constraints

我想通过将 ALTER 添加到特定列来CONSTRAINT 我现有的表以遵守某些正则表达式。

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

ALTER TABLE users
    ADD CONSTRAINT users_prefix_constraint 
        CHECK (users.phone_prefix ~ '^\+\d{1,3}$');

而且它工作正常。

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

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

ADD CONSTRAINT users_prefix_constraint CHECK (users.phone_prefix :: ph_prefix);

这里的问题是,CHECK 部分期望某个函数返回 boolean,而转换则不会。

  1. 有没有办法做到这一点?
  2. 这是定义约束的好方法吗?也许这不是首选方式。

2 个答案:

答案 0 :(得分:2)

我认为您忽略了域的要点。

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

ALTER TABLE users ALTER phone_prefix TYPE ph_prefix;

答案 1 :(得分:1)

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

create or replace function ph_prefix_valid(s text) returns boolean as
$$
begin
 perform s::ph_prefix;
 return true;
exception when others then
 return false;
end;
$$ language plpgsql;

然后

ADD CONSTRAINT users_prefix_constraint CHECK (ph_prefix_valid(users.phone_prefix));