我想通过将 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
,而转换则不会。
答案 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));