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

Запятые * на линии *. Мой мозг болит. – jsj

+1

Да, это единственное, о чем мы никогда не могли договориться в качестве стандарта кодирования на работе @ trideceth12. Я предпочитаю это так, так как это действительно легко увидеть, если вам не хватает одного. Каждый из них, конечно, сам. – Ben

+0

@ Бен вам большое спасибо :) – Harjinder

Смежные вопросы