0

如何在客户表中添加对列 first_name (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;

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

4

2 回答 2

3

As for the question "is there a better way to do it" regarding this constraint:

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

It's a subjective question, so here's a subjective answer: I don't think so. It does the job, it's character-set safe, and it's easy to read (for a regex).

于 2013-07-26T17:37:30.367 回答
1

您的最后一个正则表达式似乎不太正确。^[^[:digit:]]+$应该匹配任何不是由数字组成的字符串,然后你反转检查。

要么摆脱NOT,要么尝试更多这样的:[$.*[:digit:].*^]匹配任何字符序列,一个数字,然后是任何字符序列。

SQL Fiddle 上的示例

于 2013-07-26T17:19:28.343 回答