在Oracle中创建表

时间:2012-11-03 13:49:31

标签: sql oracle oracle11g

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

1 个答案:

答案 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参数决定,因此您可能不需要明确指定,但这样做是明智的。