如何创建约束以检查电子邮件在postgres中是否有效?

nun*_*nos 27 postgresql

如何创建约束以在postgres中使用正则表达式?

Mic*_*ker 50

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

(正则表达式可能不完整,您可以搜索正则表达式,以便在整个网络上进行电子邮件匹配,并选择您最喜欢的那个).

  • 该正则表达式排除了在电子邮件规范允许的用户名中包含+的地址. (3认同)
  • @smithkm,对,我说它可能在2011年不完整,现在我们知道我是对的;-) (2认同)

Pet*_*aut 19

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

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))
);
Run Code Online (Sandbox Code Playgroud)


Gaj*_*jus 6

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

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

CREATE TABLE emails (
    email email
);
Run Code Online (Sandbox Code Playgroud)

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