Sql 检查约束中的正则表达式:不接受数字
如何在customers表中的first_name(varchar2(20))列上添加约束,以使插入该列的值不包含数字 我想我已经找到了可能的解决办法:Sql 检查约束中的正则表达式:不接受数字,sql,regex,oracle,oracle11g,Sql,Regex,Oracle,Oracle11g,如何在customers表中的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 (REGEXP_LIKE(first_name,'^[[:alpha:][:blank:][:cntrl:][:punct:]]+$')) NOVALIDATE;
此外:
然而,有没有更好的方法呢?不使用所有这些字符类,在REGEXP_之前不使用“NOT”
我认为这会奏效:
ALTER TABLE customers
ADD CONSTRAINT first_name_check
CHECK (NOT REGEXP_LIKE(first_name,'^[^[:digit:]]+$')) NOVALIDATE;
但我错了。你能解释一下原因吗?你上一个regexp似乎不太正确<代码>^[^[:digit:]+$应该匹配任何不是由数字组成的字符串,但随后您可以反转检查 要么去掉
NOT
,要么再尝试一个类似的方法:[$.*[:digit::*.*.^]
以匹配任意字符序列,一个数字,然后是任意字符序列
.您的上一个regexp似乎不太正确<代码>^[^[:digit:]+$应该匹配任何不是由数字组成的字符串,但随后您可以反转检查 要么去掉
NOT
,要么再尝试一个类似的方法:[$.*[:digit::*.*.^]
以匹配任意字符序列,一个数字,然后是任意字符序列
.关于这一限制,“有没有更好的方法?”
CHECK (NOT REGEXP_LIKE(first_name,'[[:digit:]]'))
这是一个主观的问题,所以这里有一个主观的答案:我不这么认为。它可以完成任务,字符集安全,并且易于阅读(对于正则表达式)。关于此约束的问题“有没有更好的方法?”
CHECK (NOT REGEXP_LIKE(first_name,'[[:digit:]]'))
这是一个主观的问题,所以这里有一个主观的答案:我不这么认为。它完成了任务,字符集安全,而且很容易阅读(对于正则表达式)。我太困惑了!首先,我恐怕我的问题构造得不好。我想拒绝任何包含一个或多个数字的字符串。例如:“ab.d$”可以,但应拒绝“a9b”或“9ab”或“ab12”。现在,让我们来看看我的想法:<代码> ^ [^::数字:] + $ < /代码>不<代码> [FoBaa] < /Cord>意思是“任何但不是FoBar”?因此,
[^[:digit:][]
的意思不是“除了[:digit:][/code>之外的任何东西”吗?最后,看看你的想法:[$.[:digit:].*.^]
难道它不意味着:任何包括美元符号、点或星号、任何数字或点(重复)或星号(重复)或^的东西吗?我太困惑了!首先,我恐怕我的问题构造得不好。我想拒绝任何包含一个或多个数字的字符串。例如:“ab.d$”可以,但应拒绝“a9b”或“9ab”或“ab12”。现在,让我们来看看我的想法:<代码> ^ [^::数字:] + $ < /代码>不<代码> [FoBaa] < /Cord>意思是“任何但不是FoBar”?因此,[^[:digit:][]
的意思不是“除了[:digit:][/code>之外的任何东西”吗?最后,看看你的想法:[$.[:digit::].*.^]
难道它不意味着:任何包括美元符号、点或星号或任何数字或点(重复)或星号(重复)或^?