我试图复制你的问题。问题是在你的范围内使用' - '作为期限后的最后一个字母。改用逗号。
考虑:
表:
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为上限值。
'@ [A-Za-z0-9 ._-] + \。[A-Za-z] {2,4} $'是不够的,请考虑TLD喜欢[.museum](https:/例如/en.wikipedia.org/wiki/.museum)。 –
@WernfriedDomscheit - 这是正确的,但它应该是对OP的评论,而不是对这个答复者的评论。 Rogue Coder正确识别了OP代码中的错误。 {m,n}中的“n”是否应该大于4是商业问题,而不是编码问题。 (谁知道,也许OP有理由限制最后一个令牌为4个字符 - 并且在任何情况下与本答复无关。) – mathguy
同意这两个意见。显然,以'。'开头的电子邮件ID看起来很奇怪,但是谁知道! –