2011-10-01 55 views
2

我正在使用Oracle 11g,並嘗試創建一個表來定義創建約束。Oracle 11g - 使用正則表達式檢查約束

我嘗試添加檢查約束來驗證一些信息(如電子郵件地址,電話號碼等)

有什麼在Oracle 11g中,將允許我做這樣的事情?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX') 

我想用正則表達式(從regexLib搶下)是:

^[a-zA-Z][a-zA-Z0-9_\.\-][email protected]([a-zA-Z0-9-]{2,}\.)+([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$ 

我想的Oracle 11g(糾正我,如果我錯了)不支持這種格式的正則表達式..

我見過使用REGEX_LIKE的方法,但它似乎只適用於WHERE子句。

我想保留它作爲檢查約束,而不是觸發器或外部函數/腳本。

此外,我已閱讀過其他主題,有人說RegEx'不是驗證電子郵件地址格式和此類信息的好方法。評論中沒有任何理由,我想知道爲什麼,如果有理由!

+3

這正則表達式應該被取出並射擊。我希望它在RegexLib上不是那樣的。 「'alum'」?無用的量詞?缺少標點符號?除此之外,正則表達式不適用於驗證電子郵件地址,因爲格式對於可靠的正則表達式來說過於可變(您總是會錯過有效的郵件並接受無效的郵件)。您可以做的最好的方法是檢查是否存在「@」符號,並嘗試向其發送確認電子郵件。如果成功,並且如果您收到回覆郵件,則知道該地址有效且處於活動狀態。 –

+0

@TimPietzcker對不起,我改變了實際的regEx,這是對原始版本的混搭,我從Oracle文檔中嘗試過。 – Pacane

回答

11

檢查約束遵循相同的語法規則作爲用於WHERE子句的條件:在手冊中

alter table foo 
    add constraint check_email 
    check (REGEXP_LIKE(email,'your_regex_goes_here','I')); 

更多細節:

編輯:

然而,有什麼你可以在檢查約束實際使用一些限制:

+0

也許你可以告訴我,我試過這個:「alter table JOURNALISTE add constraint check_email check(REGEXP_LIKE(COURR_JOUR,'^ [a-zA-Z] [a-zA-Z0-9 _ \。\ - ] + @([A-ZA-Z0-9 - ] {2,} \。)+([A-ZA-Z] {2,4} | [A-ZA-Z] {2} \ [A-ZA。 -Z] {2})$','I'))「我仍然無法在插入語句中輸入有效的電子郵件地址。我在regEx lib上使用了此RegEX,但我不確定它是否受Oracle支持。我讀過關於regEX的文檔的一些部分,它似乎沒有使用這個標準的數字,它似乎使用類似於:num或類似的東西... – Pacane

+0

這不是真的,「**任何東西* *可以在WHERE條件中使用,可用於檢查約束。「例如,檢查約束不能引用其他表中的列,不能調用不確定性的函數,也不能調用用戶定義的函數。請參閱[限制檢查限制](http://docs.oracle.com/cd/E11882_01/server.112/e26088/clauses002.htm#i78179)[** 11g第2版(11.2)**]。 – DavidRR

+0

@DavidRR:很好,謝謝。我指的是語法,而不是真實的表達。我澄清了我的帖子。 –