Delphi 3 и создание приложений баз данных


22.8. Требования к значениям столбцов


Требования к значениям отдельных столбцов могут определяться как на уровне конкретного столбца, так и на уровне таблицы. Например, для таблицы 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 -

возвращает уникальное значение генератора.




Начало  Назад  Вперед



Книжный магазин