Требования к значениям столбцов
Требования к значениям отдельных столбцов могут определяться как на уровне конкретного столбца, так и на уровне таблицы. Например, для таблицы PERSON_PARAMS (параметры человека) рост (HEIGHT) должен быть больше веса (WIEGHT). Тогда данное ограничение на уровне столбца определяется следующим образом:
CREATE TABLE PERSON_PARAMS( ID INTEGER NOT NULL PRIMARY KEY,
HEIGHT INTEGER NOT NULL, WIEGHT INTEGER NOT NULL CHECK(HEIGHT >WIEGHT) ) ;
а на уровне таблицы определяется - так:
CREATE TABLE PERSON_PARAMS(ID INTEGER NOT NULL, HEIGHT INTEGER NOT NULL,
WIEGHT INTEGER NOT NULL, PRIMARY KEY(ID), CHECK(HEIGHT > WEIGHT) );
Ограничения, накладываемые на столбцы таблицы, определяются при помощи предложения CHECK, общий формат которого приводится ниже.
CHECK (<условия поиска>) <условия_поиска> = {<значение> <оператор> {<значение1> | (<выбор_одного>)}
<значение> [NOT] BETWEEN <значение1> AND <значение2>
<значение> [NOT] LIKE <значение> [ESCAPE <значение>]
<значение> [NOT] IN ( <значение1> [, <значение2> ...] |
<выбор_многих>)
<значение> IS [NOT] NULL
<значение> { [NOT] {=|<|>} I >= I <=}
{ALL ] SOME | ANY} (<выбор_многих>)
EXISTS (<выражение_выбора>)
| SINGULAR (<выражение_выбора>) | <значение> [NOT] CONTAINING <значение1>
<значение> [NOT] STARTING [WITH] <значение1>
(<условия_поиска>) NOT <условия поиска>
<условия поиска> OR <условия поиска>
<условия поиска> AND <условия_поиска>}
<значение> = {столбец | <константа> I <выражение> I <функция> | NULL I USER | RDB$DB_KEY
} [COLLATE collation]
<константа> = число | "строка"
<функция> = {
COUNT (* | [ALL] <значение> | DISTINCT <значение>)
| SUM ([ALL] <значение> | DISTINCT <значение>)
AVG ([ALL] <значение> | DISTINCT <значение>)
MAX ([ALL] <значение> | DISTINCT <значение>)
MIN ([ALL] <значение> | DISTINCT <значение>)
CAST ( <значение> AS <тип_данных>)
UPPER ( <значение>)
GEN ID (генератор, <значение>)
}
<оператор>
= {= | < | > | <= | >= | !< | !> | о | !=}. Назначение операторов:= равно;
< меньше;
> больше;
<= меньше или равно (не больше);
>= больше или равно (не меньше);
!< не меньше (больше или равно);
!> не больше (меньше или равно);
<> неравно;
!= неравно;
<выбор_одного>
= оператор SELECT, возвращающий одно значение или ни одного.<выбор_многих>
= оператор SELECT, который может возвращать более одного значения (список значений) или ни одного.<выражение_выбора>
= оператор SELECT , который может возвращать более одного значения (список значений) или ни одного.• <значение> <оператор> <значение1> определяет, что значение столбца находится со значением 1 во взаимоотношениях, определяемых оператором, который может принимать одно из следующих значений:
<оператор> = {= | < | > | <= | >= | !< | !> | <> | !=} Например, значение столбца STOLBEZ не должно быть меньше 100: CREATE TABLE TBL (CHECK(STOLBEZ >= 100););
• <значение> <оператор> (<выбор_одного>) определяет, что значение столбца находится во взаимоотношениях, определяемых оператором оператор, с результатом выполнения запроса SELECT к одной или нескольким таблицам БД, причем в качестве результата выполнения запроса возвращается единичное значение {выбор_одного).
Пример.
Пусть существует таблица TOVAR (остаток товара на складе).CREATE TABLE TOVAR (TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,OSTATOK INTEGER NOT NULL,PRIMARY KEY (TOVAR));
Требуется создать таблицу RASHOD (расход товара со склада) и для столбца KOLVO_R (количество расхода) предусмотреть ограничение: количество расхода данного товара не может быть больше его текущего остатка (значение столбца OSTATOK для данного значения товара) в таблице TOVAR)
CREATE TABLE RASHOD (
ID_RS INTEGER NOT NULL,
TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,
DATE_RASH DATE NOT NULL,
KOLVO_R INTEGER NOT NULL,
PRIMARY KEY (ID_RS),
CONSTRAINT RASH_TOVAR
FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),
CONSTRAINT PO_OSTATKU
CHECK(KOLVO_R <=
(SELECT TOVAR.OSTATOK FROM TOVAR WHERE TOVAR.TOVAR = RASHOD.TOVAR))
);
• <энвчение> BETWEEN <значение1> AND <эначение2>
определяет, что значение столбца должно находиться в диапазоне от значение] до эначение2.CREATE TABLE TBL (CHECK(STOLBEZ BETWEEN 100 AND 200);) ;
• LIKE <значение> [ESCAPE <значение>]
определяет, что содержимое столбца должно "походить" на значение. При этом употребляется символ '%' для указания любого значения любой длины и символ '_' (подчеркивания) для указания любого единичного символа. Например, указание ограниченияCREATE TABLE TBL (CHECK (STOLBEZ LIKE "%USD"));
читается так: вводимое в столбец значение должно оканчиваться символами •USD', независимо от того, какие символы и сколько расположены перед ними;
указание же ограничения CREATE TABLE TBL(CHECK (STOLBEZ LIKE "_94");) ;
означает, что вводимое в столбец значение может содержать 4 символа, из которых первые два - любые и последние два - '94'.
ESCAPE <значение>
используется, если в операторе LIKE символы "%" или '_' должны использоваться в шаблоне подобия. В этом случае выбирается некоторый символ, например '!', после которого символы '%', '_' входят в поисковую строку как непосредственно поисковые символы. В этом случае символ '!' указывается после слова ESCAPE, например:CREATE TABLE TBL(CHECK(STOLBEZ LIKE "%!%" ESCAPE "!"););
<значение>
{= | < | >} | >= | <=} {ALL | SOME | ANY} (<выбор_иногих>) определяет, что значение столбца больше, меньше и т.д. всех (ALL) или некоторых (SOME или ANY), значений в списке выбор_многих. Список значений выбор_иногих выдается как результат выполнения оператора SELECT по отношению к од но и или нескольким таблицам БД.Пример.
Пусть определены таблицы TOVAR и PRIHOD:CREATE TABLE TOVAR ( TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL, PRIMARY KEY (TOVAR) );
CREATE TABLE PRIHOD ( ID_PR INTEGER NOT NULL,
TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,
DATE_PRIH DATE NOT NULL,
KOLVO_P INTEGER NOT NULL,
PRIMARY KEY (ID_PR)
CONSTRAINT PRIHOF_TOVAR
FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR)
) ;
Определим таблицу RASHOD, у которой дата расхода товара DATE_RASH больше всех дат прихода данного товара DATE_PRIH в таблице PRIHOD:
CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,
TOVAR VARCHAR(20).CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,
DATE_RASH DATE NOT NULL,
KOLVO_R INTEGER NOT NULL,
PRIMARY KEY (ID_RS),
CONSTRAINT RASH_TOVAR
FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),
CONSTRAINT PO_DATE_RASH
CHECK ( DATE_RASH > ALL
SELECT DATE_PRIH
FROM PRIHOD
WHERE PRIHOD.TOVAR = RASHOD.TOVAR)));
Как видно, в операторе SELECT в предложении WHERE указана только таблица PRIHOD. Таблица RASHOD в предложении WHERE не указана, но подразумевается, поскольку именно на нее наложено ограничение PO_DA ТЕ. Кроме того, в этом случае условие выборки WHERE PRIHOD.TOVAR = RASHOD.TOVAR подразумевает текущее значение RASHOD. TOVAR, т.е. значение, введенное в добавляемую запись таблицы RASHOD, - запись, значение столбца DA TE_RASH которой и проверяется на соответствие условию, заданному в CHECK в ограничении CONSTRAINT PO_DA TE_RASH. Указание в предложении WHERE обеих таблиц, FROM PRIHOD, RASHOD приведет к тому, что условие WHERE PRIHOD.TOVAR = RASHOD.TOVAR будет воспринято как внутреннее соединение таблиц PRIHOD и RASHOD по столбцу ТОVAR. В этом случае соединение будет произведено для всех значений столбца TOVAR в таблице RASHOD, а не для текущего значения той записи таблицы RASHOD, чье значение DA TE_RASH проверяется на соответствие условию.
• EXISTS (<выражение_вь1бора>) - возвращает True, если список выражение„выбора непустой, т.е. содержит хотя бы одну строку. Список выражение_выбора выдается как результат выполнения оператора SELECT по отношению к одной или нескольким таблицам БД.
В приводимом ниже примере обязательно существование хотя бы одной записи в таблице PRIHOD с таким же значением столбца TOVAR, что и в поле TOVAR записи таблицы RASHOD.
CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,
TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,
DATE_RASH DATE NOT NULL,
CONSTRAINT RASH_TOVAR
FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),
CONSTRAINT PO_DATE_RASH
CHECK (EXISTS (SELECT TOVAR FROM PRIHOD
WHERE PRIHOD.TOVAR = RASHOD.TOVAR))
);
• SINGULAR (<выражение_вь1бора>) - возвращает True, если список выражение_выбора содержит только одну строку. Список выражение_выбора выдается как результат выполнения оператора SELECT по отношению к одной или нескольким таблицам БД.
В приводимом ниже примере обязательно существование единственной записи в таблице PRIHOD с таким же значением столбца TOVAR, что и в поле TOVAR записи таблицы RASHOD.
CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,
TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL
COLLATE PXW_CYRL,
DATE_RASH DATE NOT NULL,
CONSTRAINT RASH_TOVAR
FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),
CONSTRAINT PO__DATE_RASH
CHECK (SINGULAR(SELECT TOVAR FROM PRIHOD
WHERE PRIHOD.TOVAR = RASHOD.TOVAR))
);
• <значение> CONTAINING <значение1> определяет, что значение столбца должно содержать вхождение значение1, не важно в каком месте.
В приводимом ниже примере поле значение STOLBEZ должно содержать вхождение символов 'USD', независимо от того, какие символы и в каком количестве расположены перед ними или после них.
CREATE TABLE TBL(CHECK (STOLBEZ CONTAINING "USD"));
• <значение> STARTING [WITH] <значение1> определяет, что значение столбца должно начинаться с символов значение1.
В приводимом ниже примере поле значение STOLBEZ должно начинаться с символов 'USD'.
CREATE TABLE TBL (CHECK (STOLBEZ STARTING WITH "USD")) ;
• Может быть задана комбинация условий, которым должно соответствовать значение. В этом случае отдельные условия соединяются операторами AND или OR.
• Для многих из приведенных условий (см. формат CHECK) может быть выдано отрицание при помощи слова NOT. Например:
CHECK(NOT STOLBEZ1 > STOLBEZ2);
• В качестве <значение> можно указывать имя столбца, константу, выражение, функцию.
• В качестве функций могут использоваться:
• COUNT -
счетчик повторения;• SUM -
сумма;• AVG -
среднее значение;• МАХ -
максимальное значение;• MIN -
минимальное значение;• CAST -
приведение типов;• UPPER -
приведение всех букв к заглавным;• GEN_ID -
возвращает уникальное значение генератора.