Oracle SQL开发人员限制数据类型char的字符数(5)
我的任务是实现一个带有变量groupcode的表。有几个要求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
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之间”。