2016-12-09 30 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看起来很奇怪,但是谁知道! –