我正在尝试创建一个Oracle SQL * Plus表,但我在使用正则表达式的约束时遇到问题。
我想要实现的约束是该字段长度为4个字符,不能包含以下字符:,。!£$ *<>“=
实际上我只够允许使用字母数字字符,所以我尝试了以下正则表达式约束:
CONSTRAINT CHK_Foo CHECK (Foo LIKE '[[:alnum:]]'),
然而,当我试图输入AAAA
字段时,它说我违反了约束条件。
我是Regexp的全新人,也是SQL的新手,所以任何关于它为什么不起作用的解释都会非常感激!
答案 0 :(得分:3)
两个选项:
CHECK (REGEXP_LIKE( foo, '[^,.!£$*<>"=]{4}' ) )
将接受所有不包含,.!£$*<>"=
CHECK (REGEXP_LIKE( bar, '[a-zA-Z0-9]{4}' ) )
将接受仅包含a-zA-Z0-9
(如果您希望少于长度小于或等于4个字符的字符串,则可以将{4}
替换为{0,4}
)
Oracle 11g R2架构设置:
CREATE TABLE test (
foo CHAR(4) NOT NULL,
bar CHAR(4) NOT NULL,
CONSTRAINT chk_foo CHECK (REGEXP_LIKE( foo, '[^,.!£$*<>"=]{4}' ) ),
CONSTRAINT chk_bar CHECK (REGEXP_LIKE( bar, '[a-zA-Z0-9]{4}' ) )
);
查询1 :
INSERT INTO test VALUES ( 'AAAA', '"AAA' );
结果1 :
ORA-02290: check constraint (USER_4_850C2.CHK_BAR) violated : INSERT INTO test VALUES ( 'AAAA', '"AAA' )
查询2 :
INSERT INTO test VALUES ( '$AAA', 'AAAA' );
结果2 :
ORA-02290: check constraint (USER_4_850C2.CHK_FOO) violated : INSERT INTO test VALUES ( '$AAA', 'AAAA' )
查询3 :
INSERT INTO test VALUES ( 'AAAA', 'AAAA' )
结果3 :
答案 1 :(得分:2)
CONSTRAINT CHK_Foo CHECK (regexp_LIKE(Foo, '^\w{4}$'))
答案 2 :(得分:0)
你应该构建一个正确的Oracle regexp,然后使用REGEXP_LIKE而不仅仅是LIKE。
见这里:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm
http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#CHDIDJJC