oracle约束小写

ghhkc1vu  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(390)

我必须进行oracle约束,检查用户名是否至少是3个小写字母,最多是10个小写字母。
我用过

constraint usernameSMALLCASE check (
    REGEXP_Like(username,'^[a-z]{10}$') or 
    REGEXP_Like(username,'^[a-z]{9}$') or
    REGEXP_Like(username,'^[a-z]{8}$') or 
    REGEXP_Like(username,'^[a-z]{7}$') or 
    REGEXP_Like(username,'^[a-z]{6}$') or
    REGEXP_Like(username,'^[a-z]{5}$') or 
    REGEXP_Like(username,'^[a-z]{4}$') or 
    REGEXP_Like(username,'^[a-z]{3}$')
)

然而,它不起作用。不知何故,投入美元是造成问题的原因。但我必须放$以确保行尾字符也是小写。

b4lqfgs4

b4lqfgs41#

如果列声明正确,代码应该可以工作。但你可以大大简化它:

constraint usernameSMALLCASE check ( REGEXP_Like(username, '^[a-z]{3,10}$') )

显然,除了正则表达式之外,还有其他方法可以处理这个问题。但是,您已经开始使用正则表达式,使用正则表达式非常简单。
如果您坚持使用固定长度的列,可以将其表示为:

constraint usernameSMALLCASE check ( REGEXP_Like(username, '^[a-z]{3,10} *$') )
ef1yzkbh

ef1yzkbh2#

为创建约束

username = lower(username) and length(username) > 3

数据类型可以强制的最大长度

username VARCHAR2(10 CHAR) NOT NULL

注意,正则表达式 ^[a-z]{3,10}$ 不完全可靠,请参见正则表达式中的字符类“[::]”
一个不起作用的例子是:

ALTER SESSION SET NLS_SORT = XSPANISH;

BEGIN
    IF REGEXP_LIKE('ch', '^[a-d]$') THEN
        DBMS_OUTPUT.PUT_LINE('TRUE');
    ELSE
        DBMS_OUTPUT.PUT_LINE('FALSE');
    END _IF;
END;

退货 TRUE (尽管 h 不是介于 a-d )因为 ch 在传统西班牙语中被认为是一个排序字符。
我认为100%可靠的约束是这样的:

REGEXP_LIKE(TRANSLATE(username, 'abcdefghijklmnopqrstuvwxyz', '**************************'), '^\*{3,10}$') 
   AND username NOT LIKE '%*%'

相关问题