2012-11-03 89 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