2017-01-23 2 views
-2

В ниже коде, как определить проверочное ограничение, которое может предотвратить значение от 10,20,30 просунутькак определить проверочное ограничение в оракуле

create table testtable(
    testtableid integer primary key, 
    testtableno integer unique, 
    testtablename varchar2(255), 
    testtablevalue number check(testtablevalue <>10 
          or testtablevalue <>20 
          or testtablevalue<>30), 
    testtable date DEFAULT sysdate, 
    empid number FOREIGN key references empmaster(empid) 
) 

ответ

3

INTEGER является одним из типов данных ANSI, что Oracle поддерживает и отмечает ее эквивалент NUMBER(p,0). Использование INTEGER имеет семантическое значение в том, что рецензенты будут знать, что это не просто число заданной точности, а обязательное целое.

(Проверьте этот ответ, чтобы лучше понять разницу между INTEGER и NUMBER в Oracle: https://stackoverflow.com/a/23916374/2611451)

вам нужен CONSTRAINT ключевое слово, и вы можете использовать NOT IN для того, чтобы определить проверочное ограничение:

create table testtable(
    testtableid Number primary key, 
    testtableno Number unique, 
    testtablename varchar2(255), 
    testtablevalue Number, 
    ... 
    CONSTRAINT tblValue_chk check(testtablevalue NOT IN (10, 20, 30)) 
    .... 
) 

EDIT

проверка также может быть применен встроенный:

create table testtable(
    testtableid Number primary key, 
    testtableno Number unique, 
    testtablename varchar2(255), 
    testtablevalue Number check(testtablevalue NOT IN (10, 20, 30)) 
) 
+0

Параметр 'constraint' ключевое слово необходимо для ограничения уровня таблицы; это совершенно справедливо для определения контрольных ограничений inline. – APC

+0

спасибо за сообщение, отредактировал ответ – KAD

+0

[Документация по типам данных Oracle 12c] (https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF00213) включает в себя «INTEGER» как один из типов данных ANSI что Oracle поддерживает и отмечает, что его эквивалент равен «NUMBER (p, 0)», но делает нулевую ссылку на него устаревшей. У вас есть ссылка для вашего заявления, что это так? Использование 'INTEGER' имеет семантическое значение в том, что рецензенты будут знать, что это не просто число заданной точности, а обязательное целое. – MT0

3

«предотвращающие значения 10,20,30»

Вы хотите, чтобы все эти значения, так что вы должны использовать булевой.

testtablevalue number check(testtablevalue <> 10 
          AND testtablevalue <> 20 
          AND testtablevalue<>30), 

Использование NOT IN требует меньше набирать для длинных списков запрещенных значений:

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