案例要求:
建立check constraint ,要求字段输入内容必须是“00[number][number][a-z]”:
通过正则表达式建立如下约束(constraint):
17:20:13 SCOTT@ prod >desc card
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
ID NOT NULL VARCHAR2(10)
17:22:53 SCOTT@ prod >
17:19:05 SCOTT@ prod >alter table card drop constraint card_ck;
Table altered.
建立正则表达式:
17:19:19 SCOTT@ prod >alter table card add constraint card_ck check (REGEXP_LIKE(id,'00[[:digit:]]{2}[[:lower:]]{1}'));
Table altered.
Elapsed: 00:00:00.06
测试:
17:19:33 SCOTT@ prod >insert into card values ('0055a');
1 row created.
Elapsed: 00:00:00.01
17:19:50 SCOTT@ prod >insert into card values ('0065z');
1 row created.
Elapsed: 00:00:00.00
17:20:04 SCOTT@ prod >insert into card values ('1188a');
insert into card values ('1188a')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CARD_CK) violated
Elapsed: 00:00:00.01
正则表达式说明:
表 5:REGEXP_LIKE 操作符
语法 |
说明 |
REGEXP_LIKE(source_string, pattern [, match_parameter]) |
source_string 支持字符数据类型(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2 和 NCLOB,但不包括 LONG)。pattern 参数是正则表达式的另一个名称。match_parameter 允许可选的参数(如处理换行符、保留多行格式化以及提供对区分大小写的控制)。 |
表 1:定位元字符
元字符 |
说明 |
^ |
使表达式定位至一行的开头 |
$ |
使表达式定位至一行的末尾 |
表 2:量词或重复操作符
量词 |
说明 |
* |
匹配 0 次或更多次 |
? |
匹配 0 次或 1 次 |
+ |
匹配 1 次或更多次 |
{m} |
正好匹配 m 次 |
{m,} |
至少匹配 m 次 |
{m, n} |
至少匹配 m 次但不超过 n 次 |
表 3:预定义的 POSIX 字符类
字符类 |
说明 |
[:alpha:] |
字母字符 |
[:lower:] |
小写字母字符 |
[:upper:] |
大写字母字符 |
[:digit:] |
数字 |
[:alnum:] |
字母数字字符 |
[:space:] |
空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符 |
[:punct:] |
标点字符 |
[:cntrl:] |
控制字符(禁止打印) |
[:print:] |
可打印字符 |