2016-12-09 27 views
0

儘管我已經閱讀了多個使用完全相同表達式的Oracle論壇,但是我在數據庫設計中爲驗證電子郵件地址而創建的正則表達式不起作用。每次我試圖插入電子郵件,我得到一個檢查約束違反REGEXP_LIKE(電子郵件在Oracle PL中不起作用SQL

CONSTRAINT check_email CHECK(REGEXP_LIKE(
Email,'^[A-Za-z0-9._-][email protected][A-Za-z0-9._-]+\.[A-Za-z]{2-4}$')) 

試圖形式的內頁時:?

INSERT INTO Member VALUES(0042, '[email protected]'); 

任何人都可以揭示出這個任意光

謝謝!

回答

3

我試圖複製你的問題。問題是在你的範圍內使用' - '作爲期限後的最後一個字母。改用逗號。

考慮:

表:

CREATE TABLE abc_1(abc_id NUMBER(10), email VARCHAR2(100)); 

約束(同你的):

ALTER TABLE abc_1 ADD CONSTRAINT abc_email_check CHECK(REGEXP_LIKE(Email,'^[A-Za-z0-9._-][email protected][A-Za-z0-9._-]+\.[A-Za-z]{2-4}$')); 

插入語句:

INSERT INTO abc_1 VALUES (1001, '[email protected]'); --Fails, expected 
    INSERT INTO abc_1 VALUES (1001, '[email protected]'); --Fails, not expected 

的問題是與所述範圍指定{2-4} 。它最好被用{2,4} 替換您檢查約束爲:

ALTER TABLE abc_1 ADD CONSTRAINT abc_email_check CHECK(REGEXP_LIKE(Email,'^[A-Za-z0-9._-][email protected][A-Za-z0-9._-]+\.[A-Za-z]{2,4}$')); 

    INSERT INTO abc_1 VALUES (1001, '[email protected]'); --Fails, expected 
    INSERT INTO abc_1 VALUES (1001, '[email protected]'); --Success, expected 

當正則表達式指定範圍內,所述方式爲{M,N},其中m是下限值和n爲上限值。

+0

'@ [A-Za-z0-9 ._-] + \。[A-Za-z] {2,4} $'是不夠的,請考慮TLD喜歡[.museum](https:/例如/en.wikipedia.org/wiki/.museum)。 –

+0

@WernfriedDomscheit - 這是正確的,但它應該是對OP的評論,而不是對這個答覆者的評論。 Rogue Coder正確識別了OP代碼中的錯誤。 {m,n}中的「n」是否應該大於4是商業問題,而不是編碼問題。 (誰知道,也許OP有理由限制最後一個令牌爲4個字符 - 並且在任何情況下與本答覆無關。) – mathguy

+0

同意這兩個意見。顯然,以'。'開頭的電子郵件ID看起來很奇怪,但是誰知道! –