Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL开发人员限制数据类型char的字符数(5)_Sql_Regex_Oracle_Sqldatatypes_Check Constraints - Fatal编程技术网

Oracle SQL开发人员限制数据类型char的字符数(5)

Oracle SQL开发人员限制数据类型char的字符数(5),sql,regex,oracle,sqldatatypes,check-constraints,Sql,Regex,Oracle,Sqldatatypes,Check Constraints,我的任务是实现一个带有变量groupcode的表。有几个要求 字符(5) 2或4个大写字母加上1个数字,其值介于1和4之间(例如,AA1、AABB1) 任何违反第1点和第2点的输入都应被禁止 我唯一能想到的就是像regexp_一样,但是我的努力是徒劳的 create table Test( groupcode char(5) check( regexp_like(groupcode, '^[A-Z]{2}[0-9]$', 'c') ) ); INSERT INTO Test(groupcod

我的任务是实现一个带有变量groupcode的表。有几个要求

  • 字符(5)
  • 2或4个大写字母加上1个数字,其值介于1和4之间(例如,AA1、AABB1)
  • 任何违反第1点和第2点的输入都应被禁止
  • 我唯一能想到的就是像regexp_一样,但是我的努力是徒劳的

    create table Test(
    groupcode char(5) check(
    regexp_like(groupcode, '^[A-Z]{2}[0-9]$', 'c') 
    )
    );
    
    INSERT INTO Test(groupcode) VALUES ('AA1');
    
    我插入了这个,但它一直告诉我有一些违反,我不明白

    我指定
    ^
    $
    是因为我不希望出现类似
    'bbAA1'
    'AA1bb'
    的内容

    我也对非正则表达式解决方案持开放态度。在今天下午的所有工作之后,我开始怀疑我的方法

    编辑——给蒂姆:

    我建议:

    CREATE TABLE Test (
        groupcode VARCHAR(5),
        CONSTRAINT (CHECK(REGEXP_LIKE(groupcode, '^[A-Z]{2}([A-Z]{2})?[1-4]$', 'c')))
    );
    
    下面是对正则表达式模式的解释:

    ^                from the start of the column
        [A-Z]{2}     match AA, AB, BB, etc.
        ([A-Z]{2})?  then match another optional AA, AB, BB, etc.
        [1-4]        match 1-4
    $                end of the column
    


    后期编辑:@Horse答案正确地指出您应该在这里使用
    VARCHAR
    。但是你的正则表达式也有一个问题,我已经解决了。

    你的正则表达式只允许(恰好)三个字符。但是定义为
    char(5)
    的列如果提供少于三个空格,则会用空格填充,因此实际上
    'AA1'
    将存储为
    'AA1'
    ,这违反了您的正则表达式

    改用
    char(3)

    更好的是,永远不要使用
    char
    (您刚刚经历了其中一个原因),使用
    varchar(5)
    varchar(3)
    两者都可以与您的正则表达式一起使用


    2或4个大写字母加1个数字,其值介于1和4之间

    你的正则表达式不是这么做的
    [A-Z]{2}
    正好是两个大写字母。如果要允许不同长度的模式,则无法使用
    char(5)
    ,除非在正则表达式中还包含空格:

    create table test
    (
      groupcode char(5) check(
          regexp_like(groupcode, '(^[A-Z]{2}[0-9]  $)|(^[A-Z]{4}[0-9]$)', 'c'))
    );
    

    上面的正则表达式允许两个大写字符后跟一个数字和两个空格,或者四个大写字符后跟一个数字。

    @AndesLam我搞错了检查约束语法(但也假设你有这个权利)。尝试在CREATETABLE语句中将check约束列为正式约束。我的答案似乎是有效的,至少在一个演示中是这样的。正式的约束是否意味着
    约束测试检查(regexp_-like(groupcode),^[a-Z]{2}([a-Z]{2})?[1-4]$,'c')
    ?因为在这种情况下,oraclesqldeveloper仍然不让步。但我明白其中的逻辑((好消息:我非常感谢我理解了
    'AA1'
    的概念;坏消息:我需要严格遵守char(5)约束。(@AndesLam:2大写字母加1位数部分)不能满足于
    char(5)
    列上的正则表达式。你真的应该使用
    varchar(5)
    相反。使用
    char(5)
    时绝对没有任何优势(无论是在性能上还是在存储空间上)只有劣势。是否给出了使用
    char(5)的原因
    ?这不仅在这里是错误的,
    char
    总是错误的。我从来没有看到它作为列数据类型的良好用途。有一个论点认为它记录了值将始终具有特定长度的意图,但我从来没有发现这一点有说服力-如果长度如此重要,请添加一个检查约束。可能此人要求我不知道CHAR(3)或VARCHAR(3)如何适应更长的代码(在同一列中)。另外:regexp可以简化为
    ^([A-Z]{2}){1,2}[1-4]$
    。注意
    [1-4]
    结尾-OP使用了
    [0-9]
    ,但他给出的要求是“在1和4之间”。