Определение контролируемого значения столбца
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Конструкция
<контролируемое значение столбца>
задает условие, которому должно удовлетворять значение столбца при операции добавления (модификации) записи. Если<контролируемое значение столбца>
возвращает значение true, то значение столбца считается корректным, в противном случае – недопустимым. -
<Логическое выражение>
не должно содержать ссылок на другие столбцы данной таблицы, кроме него самого.Проверка кода города в телефонных номерах create or replace table test (col1 char(15) check (substr(col1,1,3)='473')); insert into test(col1) values ('473-2-711-711'); insert into test(col1) values ('495-274-453-776'); //недопустимая запись. insert into test(col1) values ('473-2-654-300'); select * from test | 473-2-711-711| | 473-2-654-300|
-
Использование столбцов с атрибутом AUTOROWID в
<логическом выражении>
запрещено. -
Использование предиката [NOT] CONTAINS в
<логическом выражении>
конструкции запрещено (см. документ «Полнотекстовый поиск в базе данных», пункт «Предикат полнотекстового поиска»). -
Разрешено использование значений SYSDATE, NOW, LOCALTIME, LOCALTIMESTAMP, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP в
<контролируемом значении столбца>
. Однако при этом в БД могут оказаться записи, которые удовлетворяли<контролируемому значению столбца>
в момент выполнения операции INSERT/ UPDATE, но со временем перестали удовлетворять этому ограничению, т.к. текущее значение этих значений стало другим.select to_localtime(sysdate); create or replace table test(i int, d date default localtimestamp on update current_time check (d < localtimestamp + to_date('01','SS'))); insert into test(i) values(1); select d from test; update test set i=2; select d from test; ! запись не удовлетворяет условию CHECK insert into test(i, d) values(2,localtimestamp + to_date('02','SS')); Результат работы примера: |05.03.2012:16:25:48.47| D - |05.03.2012:16:25:48.52| D - |00.00.0000:16:25:48.52| INL : состояние выполнения : 914 Запись не удовлетворяет условию CHECK
-
<Логическое выражение>
не должно содержать подзапросов, агрегатных функций, конструкций CASE и CAST, функций SECURITY, INDEXTIME, LEAD, LAG, GETTEXTPOS.Примеры. а) create or replace table test (col1 int check (col1 between 100 and 200)); insert into test (col1) values (100); insert into test (col1) values (250); /* ошибка */ б) create or replace table test (col1 int check (col1 not in (10,20,30))); insert into test (col1) values (200); insert into test (col1) values (20); /* ошибка */ в) create or replace table test (col1 char(20) check (col1 not like 'В%')); insert into test (col1) values ('Воронеж'); /* ошибка */ insert into test (col1) values ('Москва'); insert into test (col1) values ('Урюпинск'); г) create or replace table test (col1 char(20) check (col1 similar to 'B_W')); insert into test (col1) values ('BMW'); insert into test (col1) values ('MERCEDES'); /* ошибка */ insert into test (col1) values ('LADA'); /* ошибка */ insert into test (col1) values ('B9W'); д) create or replace table test (col1 real check (col1 is not null)); insert into test (col1) values (56.008); insert into test; /* ошибка */
-
Каждый столбец может иметь произвольное число
<контролируемых значений столбца>
, но суммарная длина всех оттранслированных<контролируемых значений столбца>
не должна превышать 4 Кбайт.create or replace table tst_check(i int check (i>0) check (i<>1) check ((i<>18) and (i<>20)), c char(10) default 'Сумма'); insert into tst_check(i) values(2); insert into tst_check(i) values(1); /* ошибка */ insert into tst_check(i) values(-5); /* ошибка */ insert into tst_check(i) values(18); /* ошибка */ insert into tst_check(i) values(10); select c, i from tst_check; |Сумма| 2| |Сумма| 10|
-
Конструкция может задаваться в любом месте среди атрибутов столбца.
create or replace table tst_check(i int default 0 check (i>0) check (i<>1) check ((i<>18) and (i<>20)), c char(10) default 'Сумма'); create or replace table tst_check(i int check (i>0) check (i<>1) default 0 check ((i<>18) and (i<>20)), c char(10) default 'Сумма'); Несколько CHECK можно заменить одним create or replace table tst_check(i int check ((i>0) and (i<>1) and ((i<>18) and (i<>20))), c char(10) default 'Сумма'); create or replace table tst_check(i int check (col_check=1)); create or replace procedure col_check (in i int) result int for debug code if i>1 then return 1; else return 0; endif end; call col_check(-4); insert into tst_check(i) values(default); insert into tst_check(i) values(2); insert into tst_check(i) values(-3); select i from tst_check; delete from tst_check;
-
<Контролируемое значение столбца>
не должно содержать ссылок на другие столбцы данной таблицы, кроме него самого. -
<Логическое выражение>
может содержать ссылки только на столбцы данной таблицы, которые уже определены в<спецификации столбцов таблицы>
.create table t (i int, j int, check (i>j)); Дата поставки товара должна быть не позже, чем через месяц после его изготовления create or replace table pstv (crt date default sysdate, sale date, check(divtime(16,to_date(crt,'DD:MM:YYYY'), to_date(sale,'DD:MM:YYYY'))<30)); insert into pstv (sale) values (to_date('25:02:2018','DD:MM:YYYY')); insert into pstv (sale) values (to_date('10:03:2018','DD:MM:YYYY')); /* ошибка */ select * from pstv; |02.02.2018:08:36:17| 25.02.2018:00:00:00| Следующие два оператора эквивалентны: create table t (i int, j int, check ((i>j) and (i
j), check (i -
<Контролируемые значения записи>
должно задаваться через запятую либо после определения всех столбцов таблицы, либо после определения задействованных в<логическом выражении>
столбцов.Варианты: В конце списка определяемых столбцов create or replace table tst_check (i int, c char(10), d decimal, check((i+d)
0) check (i<>1) check ((i<>18) and (i<>20)), c char(10) default 'Сумма'); create or replace table tst_check(i int check (i>0) check (i<>1) default 0 check ((i<>18) and (i<>20)), c char(10) default 'Сумма'); -
Несколько
<логических условий>
можно заменять одним<логическим условием>
.create or replace table tst_check(i int check ((i>0) and (i<>1) and ((i<>18) and (i<>20))), c char(10) default 'Сумма');
Примеры
-
create or replace table test (col1 int check ((col1 between 10 and 30) and (col1<>15) and (col1>12))); insert into test (col1) values(11); / ошибка insert into test (col1) values(15); / ошибка insert into test (col1) values(37); / ошибка insert into test (col1) values(20);
-
create or replace table test (col1 int check ((col1 between 10 and 30) and (col1<>15) and (col1>12)), col2 char(20) check (col2 not like 'А%') check (col2 not like 'Б%') check (col2 not like 'В%'), col3 real check (col3*0.5+45.90>0)); insert into test (col1, col2, col3) values (25, 'Москва', 56.89); insert into test (col1, col2, col3) values (25, 'Воронеж', 45.99); // ошибка insert into test (col1, col2, col3) values (25, 'Урюпинск', -112.7); // ошибка
-
Следующие два оператора делают одно и то же:
create table t (i int check ((i>0) and (i<10))); create table t (i int check (i>0) check (i<10));
-
create or replace table test (col1 int check (col1 between 100 and 200)); insert into test (col1) values (100); insert into test (col1) values (250); /* ошибка */
-
create or replace table test (col1 int check (col1 not in (10,20,30))); insert into test (col1) values (200); insert into test (col1) values (20); /* ошибка */
-
create or replace table test (col1 char(20) check (col1 not like 'В%')); insert into test (col1) values ('Воронеж'); /* ошибка */ insert into test (col1) values ('Москва'); insert into test (col1) values ('Урюпинск');
-
create or replace table test (col1 char(20) check (col1 similar to 'B_W')); insert into test (col1) values ('BMW'); insert into test (col1) values ('MERCEDES'); /* ошибка */ insert into test (col1) values ('LADA'); /* ошибка */ insert into test (col1) values ('B9W');
-
create or replace table test (col1 real check (col1 is not null)); insert into test (col1) values (56.008); insert into test; /* ошибка */
Общие правила
-
Конструкция
<контролируемые значения записи>
задает условие, которому должно удовлетворять значение столбца (столбцов) при операции добавления/изменения записи. Если<контролируемые значения записи>
возвращает значение true, то запись считается корректной, в противном случае – недопустимой. -
<Контролируемые значения записи>
проверяются в том же порядке, в каком они создавались. -
Таблица может иметь произвольное число
<контролируемых значений записи>
, но суммарная длина всех оттранслированных<контролируемых значений записи>
не должна превышать 4 Кбайт.
Примеры
-
create or replace table test (col1 int check ((col1 between 10 and 30) and (col1<>15) and (col1>12))); insert into test (col1) values(11); /* ошибка */ insert into test (col1) values(15); /* ошибка */ insert into test (col1) values(37); /* ошибка */ insert into test (col1) values(20);
-
create or replace table test (col1 int check ((col1 between 10 and 30) and (col1<>15) and (col1>12)), col2 char(20) check (col2 not like 'А%') check (col2 not like 'Б%') check (col2 not like 'В%'), col3 real check (col3*0.5+45.90>0)); insert into test (col1, col2, col3) values (25, 'Москва', 56.89); insert into test (col1, col2, col3) values (25, 'Воронеж', 45.99); /* ошибка */ insert into test (col1, col2, col3) values (25, 'Урюпинск', -112.7); /* ошибка */
-
Следующие два оператора делают одно и то же:
create table t (i int check ((i>0) and (i<10))); create table t (i int check (i>0) check (i<10));