oracle 如何设置检查约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 如何设置检查约束相关的知识,希望对你有一定的参考价值。

电话号码十一位检查约束

参考技术A create table test(phone int check(length(phone)=11));

如果表已创建:
首先要删除不符合check约束条件的记录,然后
alter table test
add constraint check_p check(length(phone)=11);本回答被提问者采纳
参考技术B 这个用正则表达式就可以的 可以去网上搜下 有很多种

Oracle 11g - 使用 RegEx 检查约束

【中文标题】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 如何设置检查约束的主要内容,如果未能解决你的问题,请参考以下文章

Oracle如何创建一个置空的外键约束?

[Oracle]约束(constraint)

Oracle数据库之SQL基础

SQL中如何设置唯一性约束

如何使用 Oracle SQL 约束检查酒店房间是不是已预订

oracle如何操作约束