2012-11-03 88 views
-1

我的要求是accno列没有空值,也没有重复项。名称列没有空值,只接受A到Z(没有其他像数字或* $)。 acctype列是只允许('S','C','R')且balance列没有空值的字符。如果acctype是S则余额应为> = 5000,当C的余额应为> 10000时,它的R> = 5000在Oracle中创建表格

我试图与应用此:

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

+0

逗号在该行的* start *处。我的脑袋疼。 – jsj

+1

是的,这是我们在工作@ trideceth12时从未能达成的一个编码标准。我更喜欢这种方式,因为很容易看出你是否缺少一个。每个当然都是属于自己的。 – Ben

+0

@ Ben非常感谢你:) – Harjinder