-1

我的要求是该列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));
4

1 回答 1

4

这听起来像是正则表达式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中的字符仅包含在组 AZ 中,即大写拉丁字母的集合。match_parameter'c'指定匹配应该区分大小写。默认区分大小写由您的 NLS_SORT 参数确定,因此您可能不需要明确指定,但这样做是明智的。

于 2012-11-03T14:22:26.623 回答