如何解决通过检查 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
,而转换则不会。
- 有没有办法做到这一点?
- 这是定义约束的好方法吗?也许这不是首选方式。
解决方法
我认为您忽略了域的要点。
您不会将域添加为约束,而是将其用作列的数据类型:
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 举报,一经查实,本站将立刻删除。