如何在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;
但我错了。你能解释一下为什么吗?
答案 0 :(得分:3)
至于关于这个约束的问题“有没有更好的方法”:
CHECK (NOT REGEXP_LIKE(first_name,'[[:digit:]]'))
这是一个主观问题,所以这是一个主观的答案:我不这么认为。它完成了工作,它的字符集安全,并且易于阅读(对于正则表达式)。
答案 1 :(得分:1)
你的上一次正则表达似乎不太正确。 ^[^[:digit:]]+$
应该匹配任何不是由数字组成的字符串,但是你反转了支票。
要么摆脱NOT
,要么尝试另外一个:[$.*[:digit:].*^]
来匹配任何字符序列,一个数字,然后是任何字符序列。