2017-10-11 47 views
1

PostgreSQL的正则表达式这个问题是基于松散关闭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._%-][email protected][A-Za-z0-9.-]+[.][A-Za-z]+$') 

);

不过,我希望能够创建一个自定义类型,这样的语法将是以下

create table emails (
    email email_address 
); 

我本来以为CREATE TYPE会使用在这里,但因为这不是一个复合,范围和枚举类型,我不知道如何处理它。

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

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

回答

1

使用domain.

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

例子:

select 'abc'::email_address; 

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

select '[email protected]'::email_address; 

email_address 
--------------- 
[email protected] 
(1 row) 
+0

这是对完美的,因为我可以期待一个答案。谢谢! –