Sql Oracle约束小写

Sql Oracle约束小写,sql,oracle,constraints,regexp-like,Sql,Oracle,Constraints,Regexp Like,我必须进行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}$')

我必须进行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}$')
)
然而,它不起作用。 不知何故,投入美元造成了问题。但我必须放入$,以确保行尾字符也是小写。

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;
尽管h不在a-d之间,但返回TRUE,因为传统西班牙语中的ch被视为一个排序字符

我认为100%可靠的约束是这样的:

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

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

constraint usernameSMALLCASE check ( REGEXP_Like(username, '^[a-z]{3,10}$') )
显然,除了正则表达式之外,还有其他方法来处理这个问题。但是,您已经开始使用正则表达式,使用正则表达式非常简单

如果您坚持使用固定长度的列,可以表示为:

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

请在这里添加支持您观察结果的样本数据。到底什么不起作用?你的错误是什么?或者什么是被接受但不应该接受的价值观?或者哪些值被拒绝但不应该被拒绝?但是,您可以将表达式简化为:check regexp_likeuesername,“^[a-z]{3,10}$”我刚刚做了一个示例,因为您使用了@a_horse_的提示,但没有使用名称。请使用dbfiddle验证您的问题,并添加测试结果(如果有),因为它不起作用也没有帮助。它是否强制要求字段为3到10个字符长的小写字母序列?有错误吗?请使用标签下方的编辑按钮编辑您的问题,并告诉我们发生了什么。谢谢。用户名字段是如何定义的?请使用标签下方的编辑按钮编辑您的问题,并在问题中包含此信息。谢谢。我投了赞成票,但后来意识到不完全正确:用户名“1234$%^”将通过此检查。但我总是被无regexp的解决方案所吸引!从OP的描述和一点玩转来看,似乎他的用户名字段被定义为CHAR10而不是VARCHAR210,这解释了为什么正则表达式中的$会导致他的约束失败。类[a-z]不完全可靠,请参见我的答案。