2011-04-16 60 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 
); 

這樣,每次在數據庫中使用包含列的電子郵件時,都不需要重新定義正則表達式。

相關問題