Oracle 11g - 使用 RegEx 检查约束

Posted

技术标签:

【中文标题】Oracle 11g - 使用 RegEx 检查约束【英文标题】:Oracle 11g - Check constraint with RegEx 【发布时间】:2011-11-29 02:40:05 【问题描述】:

我正在使用 Oracle 11g,并尝试创建表定义创建约束。

我试图添加检查约束来验证一些信息(如电子邮件地址、电话号码等...)

Oracle 11g 中有什么东西可以让我做这样的事情吗?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX')

我想使用的正则表达式(从 regexLib 中获取)是:

^[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)$

我认为 Oracle 11g(如果我错了,请纠正我)不支持 RegEx 的这种格式...

我见过使用 REGEX_LIKE 的方法,但它似乎只适用于 WHERE 子句。

我想将其保留为检查约束,而不是触发器或外部函数/脚本。

另外,我在这里的其他线程中读到,有人说 RegEx' 不是验证电子邮件地址格式和此类信息的好方法。评论中没有给出原因,如果有原因,我想知道原因!

【问题讨论】:

该正则表达式应该被取出并拍摄。我希望 RegexLib 上不是这样。 “alum”?无用的量词?缺少标点符号?除此之外,正则表达式不适合验证电子邮件地址,因为格式对于可靠的正则表达式来说太可变了(您总是会错过有效邮件并接受无效邮件)。您可以做的最好的事情是检查是否存在@ 符号,并尝试向其发送确认电子邮件。如果成功,并且如果您收到回信,则表明该地址有效且有效。 @TimPietzcker 抱歉,我将正则表达式更改为实际的,它是原始表达式的混搭,也是我从 Oracle 文档中尝试过的。 【参考方案1】:

检查约束遵循与 WHERE 子句条件相同的语法规则:

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

手册中的更多详细信息:

对于 Oracle 11 - http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions007.htm#SQLRF52141 对于 Oracle 12 - https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52141

编辑:

然而,您可以在检查约束中实际使用的内容有一些限制:

甲骨文 11 - http://docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#SQLRF52205 甲骨文 12 - https://docs.oracle.com/database/121/SQLRF/clauses002.htm#SQLRF52205

【讨论】:

也许你可以告诉我,我已经试过了:“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 或类似的东西...... “可以在 WHERE 条件中使用的任何东西都可以在检查约束中使用”这一说法并不完全正确。例如,检查约束不能引用其他表中的列,不能调用不确定的函数,也不能调用用户定义的函数。请参阅 Restrictions on Check Constraints [11g 第 2 版 (11.2)]。 @DavidRR:很好,谢谢。我指的是语法,而不是真正的表达式。我澄清了我的帖子。 链接已损坏:/【参考方案2】:
CREATE TABLE MYTABLE(
  EMAIL VARCHAR2(30) CHECK(REGEXP_LIKE (EMAIL,'^[A-Za-z]+[A-Za-z0-9.]+@[A-Za-z0-9.-]+\.[A-Za-z]2,4$'))
);

ALTER TABLE MYTABLE ADD(CONTACT NUMBER(10) CHECK(REGEXP_LIKE(CONTACT,'[0-9]10')));


Explanation of Regular Expression
^           #start of the line
  [_A-Za-z0-9-]+    #  must start with string in the bracket [ ], must contains one or more (+)
  (         #  start of group #1
    \\.[_A-Za-z0-9-]+   #     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
  )*            #  end of group #1, this group is optional (*)
    @           #     must contains a "@" symbol
     [A-Za-z0-9]+       #        follow by string in the bracket [ ], must contains one or more (+)
      (         #      start of group #2 - first level TLD checking
       \\.[A-Za-z0-9]+  #        follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*        #      end of group #2, this group is optional (*)
      (         #      start of group #3 - second level TLD checking
       \\.[A-Za-z]2,  #        follow by a dot "." and string in the bracket [ ], with minimum length of 2
      )         #      end of group #3
$           #end of the line

【讨论】:

请为您的答案添加解释。

以上是关于Oracle 11g - 使用 RegEx 检查约束的主要内容,如果未能解决你的问题,请参考以下文章

安装 Oracle 数据库 11g 时检查 Oracle XE 服务实例失败我该怎么办

Migrating Oracle 11g R2 To Oracle 19c

win 2012 r2 安装orcale 11g 出现先决条件检查失败直接忽略会影响使用吗

Deprecation of Listener Password in Oracle 11g

oracle11g dataguard 备库数据同步的检查方法

【高分求助】连接服务器Oracle 11g数据库较慢