检查约束中的正则表达式:不接受数字

时间:2013-07-26 17:03:05

标签: sql regex oracle oracle11g

如何在customers表的第一列(varchar2(20))上添加约束,以便插入列中的值不包含数字?

我想我找到了可能的解决方案:

ALTER TABLE customers

ADD CONSTRAINT first_name_check

CHECK (REGEXP_LIKE(first_name,'^[[:alpha:][:blank:][:cntrl:][:punct:]]+$')) NOVALIDATE;

此外:

ALTER TABLE customers

ADD CONSTRAINT first_name_check

CHECK (NOT REGEXP_LIKE(first_name,'[[:digit:]]')) NOVALIDATE;

但是,还有更好的方法吗?在REGEXP_LIKE之前没有使用所有那些字符类而没有“NOT”?

我认为这样可行:

ALTER TABLE customers

ADD CONSTRAINT first_name_check

CHECK (NOT REGEXP_LIKE(first_name,'^[^[:digit:]]+$')) NOVALIDATE;

但我错了。你能解释一下为什么吗?

2 个答案:

答案 0 :(得分:3)

至于关于这个约束的问题“有没有更好的方法”:

CHECK (NOT REGEXP_LIKE(first_name,'[[:digit:]]'))

这是一个主观问题,所以这是一个主观的答案:我不这么认为。它完成了工作,它的字符集安全,并且易于阅读(对于正则表达式)。

答案 1 :(得分:1)

你的上一次正则表达似乎不太正确。 ^[^[:digit:]]+$应该匹配任何不是由数字组成的字符串,但是你反转了支票。

要么摆脱NOT,要么尝试另外一个:[$.*[:digit:].*^]来匹配任何字符序列,一个数字,然后是任何字符序列。

Example on SQL Fiddle