微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过检查 Postgres 向表添加约束

如何解决通过检查 Postgres 向表添加约束

我想通过将 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. 这是定义约束的好方法吗?也许这不是首选方式。

解决方法

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

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

ALTER TABLE users ALTER phone_prefix TYPE ph_prefix;
,

如果您有理由定义域但将其用作 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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。