我的要求是列accno
没有空值而且没有重复项。 name列没有空值,只接受A到Z(没有其他类似的数字或* $)。 acctype
列是仅允许('S','C','R')且balance
列没有空值的字符。如果acctype
是S,那么余额应该是> = 5000,当C的余额应该是> 10000,当它的R> = 5000时。
我正在尝试将其应用于:
create table kcb_acc_tab
(accno varchar2(20)
constraint kcb_acc_Pk
primary key,
name varchar2(20)
constraint kcb_name_NN
Not null
constraint kcb_name_CK
check((name =upper(name)) and (name like '[(A-Z)]')),
Acctype char
constraint kcb_acctype_ck
check (acctype in('S' ,'C' ,'R')) ,
Doo timestamp
default sysdate ,
bal number(7,2) kcb_bal_NN
constraint kcb_bal_ck
check((aacctype ='S' and bal >=5000) or
(acctype = 'C' and bal >=10000) or
(acctype ='R' and bal >=5000));
答案 0 :(得分:4)
这听起来像regular expressions的完美用例,我认为你的约束是like
的意图。
我已经大大清理了你的陈述,你在kcb_bal_ck
的定义中遗漏了一个逗号,并且我已经将约束放在最后并添加了空格。这使我更容易看到发生了什么以及可能出现的错误。
create table kcb_acc_tab(
accno varchar2(20) not null
, name varchar2(20) not null
, acctype char(1) not null -- missing size of column
, doo timestamp default sysdate not null -- missing not null
, bal number(7,2) not null
, constraint kcb_acc_pk primary key (accno)
, constraint kcb_name_ck check ( regexp_like(name, '[A-Z]', 'c' ) )
, constraint kcb_acctype_ck check ( acctype in ( 'S' ,'C' ,'R' ) )
-- acctype was spelled incorrectly.
, constraint kcb_bal_ck check( ( acctype ='S' and bal >= 5000 )
or ( acctype = 'C' and bal >= 10000 )
or ( acctype ='R' and bal >= 5000 )
) -- this parenthesis was missing
)
这里有SQL Fiddle来演示。
这与你自己的主要区别是regexp_like(name, '[A-Z]', 'c' )
。这可确保列name
中的字符仅包含在组A-Z中,即大写拉丁字母的集合。 match_parameter 'c'
指定匹配应区分大小写。默认的区分大小写由您的NLS_SORT参数决定,因此您可能不需要明确指定,但这样做是明智的。