Postgresql正则表达式的类型而不是检查约束

时间:2017-10-11 20:30:25

标签: postgresql types

这个问题基于How can I create a constraint to check if an email is valid in postgres?

我知道我可以使用字符串类型并通过检查约束来约束它:

CREATE TABLE emails (
  email varchar
  CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')

);

但是,我希望能够创建自定义类型,以便语法如下

create table emails (
    email email_address
);

我原本以为CREATE TYPE会在这里使用,但由于这不是复合,范围或枚举类型,我不确定我是如何接近它的。

对于记录,这是因为我有多个表都具有相同的检查约束。我想在一个位置调整约束(可能是通过一个类型),而不是逐个遍历所有表。我认为它也可以使表定义看起来更好(它不适用于电子邮件,但如果它被解决为“email_address”类型,它可以直接应用)。

documentation表示您可以使用输入和输出功能将字符串自动装箱到某种类型。也许如果我在收到无效的cstring时引发一个异常,它就可以按照这种方式工作,但它似乎是一个大锤,特别是考虑到我仍然希望它毕竟是一个字符串;只是一点点语法糖/重复数据删除。

1 个答案:

答案 0 :(得分:1)

使用domain.

create domain email_address as text
    check (value ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')

示例:

select 'abc'::email_address;

ERROR:  value for domain email_address violates check constraint "email_address_check"

select 'abc@mail.com'::email_address;

 email_address 
---------------
 abc@mail.com
(1 row)