2011-04-16 58 views

回答

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

(正则表达式可能是不完整的,你可以搜索为正则表达式匹配电子邮件所有网站上,并挑选你最喜欢的一个)。

+0

谢谢。这工作完美。 – nunos 2011-04-17 00:14:50

+0

我们如何使用ADD CONSTRAINT和MODIFY varient来完成ALTER命令的工作? – Mahesha999 2013-01-07 11:44:05

+0

你是什么意思添加和修改?添加你做一些像'ALTER TABLE emails ADD CONSTRAINT proper_email CHECK ....'我相信。类似修改,只需检查文档。或者,就像他们在这里说的 - 你试过了什么? – 2013-01-07 11:57:47

17

我建议使用现有的电子邮件地址解析模块,而不是组成自己的模式匹配。例如:

CREATE OR REPLACE FUNCTION check_email(email text) RETURNS bool 
LANGUAGE plperlu 
AS $$ 
use Email::Address; 

my @addresses = Email::Address->parse($_[0]); 
return scalar(@addresses) > 0 ? 1 : 0; 
$$; 

CREATE TABLE emails (
    email varchar 
    CONSTRAINT proper_email CHECK (check_email(email)) 
); 
+0

我会说这是正确的方式,但亚马逊在RDS中不支持它(perl):-(。也许有一天。 – Jackie 2018-01-20 18:58:50

1

您还可以创建domain,并在定义表格列时将其用作类型。

CREATE DOMAIN email AS TEXT CHECK (VALUE ~* '^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+[.][A-Za-z]+$'); 

CREATE TABLE emails (
    email email 
); 

这样,每次在数据库中使用包含列的电子邮件时,都不需要重新定义正则表达式。

相关问题