Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 42 43 44 45 46 47 48 49 50 ... 238

* типом данных (обязательно);

* значением по умолчанию для INSERT;

* состоянием NULL;

* ограничениями CHECK;

* набором символов (только для символьных и BLOB столбцов);

* порядком сортировки (только для символьных столбцов).

! ! !

ПРИМЕЧАНИЕ. Вы не можете использовать ограничения ссылочной целостности данных в домене.

. ! .

Преимущества инкапсуляции определения данных очевидны. Для простого, но общего примера предположим, что вы проектируете обращения к множеству малых таблиц, где вы собираетесь хранить текстовые описания пронумерованных множеств - таблицы "типов" - типы счетов, типы продуктов, типы пожертвований и т.д. Вы принимаете решение, что каждый элемент каждого из этих множеств будет иметь ключ, состоящий из трех символов в верхнем регистре, который указывает на символьное описание или поле заголовка, имеющее максимум 25 символов.

Все это требует создания двух доменов.

* Домен для указателя будет CHAR(3) с двумя дополнительными атрибутами: ограничение NOT NULL, поскольку вы собираетесь его использовать в качестве первичного ключа и ключа поиска, и ограничение CHECK для проверки наличия прописных букв. Например:

CREATE DOMAIN Туре_Кеу AS CHAR(3) NOT NULL

CHECK(VALUE = UPPER(VALUE));

* Домен описания будет VARCHAR(25). Вы хотите запретить для него пустые значения, поскольку таблицы, в которых вы собираетесь его использовать, являются управляющими:

CREATE DOMAIN Type_Description AS VARCHAR(25) NOT NULL;

Когда вы создадите эти домены, все ваши взаимосвязанные таблицы могут иметь похожие определения, а все таблицы, хранящие ключи, ссылающиеся на такие таблицы, будут использовать соответствующий домен для столбцов ключа.

Создание домена

Синтаксис языка определения данных (DDL) для создания домена:

CREATE DOMAIN домен [AS] <тип-данных>

[DEFAULT литерам |NULL |USER]

[NOT NULL] [CHECK (<условие-поиска-домена>)]

[CHARSET набор-символов| NONE]

[COLLATE порядок-сортировки];

Идентификатор домена

При создании в базе данных домена вы должны задать идентификатор домена, который является глобально уникальным в базе данных. Разработчики часто используют префикс или суффикс в идентификаторах доменов для улучшения документирования. Например:

CREATE DOMAIN D_TYPE_IDENTIFIER...

CREATE DOMAIN DESCRIPTION_D. . .

Тип данных домена

Tun данных является единственным обязательным атрибутом, который должен быть установлен для домена - все другие атрибуты необязательны. Он задает тип данных SQL, который будет применен для столбца, определенного с использованием этого домена. Может быть применен любой тип данных Firebird. Нельзя использовать домен как тип данных для другого домена.

Следующий оператор создает домен, определяющий массив символьного типа:

CREATE DOMAIN DEPTARRAY AS CHAR(31) [4:5];

Следующий оператор создает домен BLOB текстового подтипа, которому назначен набор символов, перекрывающий набор символов базы данных по умолчанию. Фактически он создает специализированный тип примечания для хранения текста на японском языке:

CREATE DOMAIN DESCRIPT_JP AS BLOB SUB_TYPE TEXT

CHARACTER SET SJIS;

Атрибут DEFAULT

Домен может определять значение по умолчанию, которое сервер будет использовать при добавлении новой строки, если оператор INSERT не содержит этот столбец в списке столбцов. Значения по умолчанию могут сэкономить время и избавить от ошибок в процессе ввода данных. Например, для столбца DATE возможным значением по умолчанию может быть текущая дата, а для столбца userName (имя пользователя) можно указать контекстную переменную CURRENT_USER.

Значение по умолчанию может быть:

* константой. Значением по умолчанию является заданная пользователем строка, числовое значение или значение даты - часто используется для помещения "нулевого значения" в столбец, куда не могут помещаться пустые значения (NULL);

* CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME или предварительно определенный литерал даты Firebird (см. главу 10);

* USER, CURRENT_USER или CURRENT_ROLE (если применяются роли);

* CURRENT_CONNECTION или CURRENT_TRANSACTION.

! ! !

ПРИМЕЧАНИЕ. Возможно указание в качестве значения по умолчанию NULL. Хотя это излишне, поскольку столбцы, допускающие пустое значение, в любом случае инициализируются по умолчанию значением NULL. Более того, явное указание значения по умолчанию NULL может привести к конфликтам, если столбец, использующий домен, должен быть определен с ограничением NOT NULL (CM. разд. "Атрибут NOT NULL" далее в этой главе).

. ! .

Следующий оператор создает домен, который должен иметь положительное значение больше 1000. Если в операторе INSERT не указан столбец, созданный на основе этого домена, столбцу будет назначено значение по умолчанию 9999:

CREATE DOMAIN CUSTNO

AS INTEGER

DEFAULT 9999

CHECK(VALUE > 1000);

Если ваша операционная система поддерживает использование многобайтовых символов в именах пользователей или если вы используете многобайтовый набор символов при определении роли, то каждый столбец, в котором должно сохраняться такое значение по умолчанию, должен быть определен с использованием подходящего набора символов.

Когда значения по умолчанию не работают

Распространенная ошибка предполагать, что значение по умолчанию будет использовано, когда Firebird получает значение NULL в столбце, имеющем значение по умолчанию. Чтобы быть уверенным в правильном использовании значений по умолчанию, нужно понимать, что значение по умолчанию будет применено:

* только при добавлении новой строки;

* только если оператор INSERT не включает столбец со значением по умолчанию в списке столбцов.

Если ваше приложение содержит столбец, имеющий значение по умолчанию, в операторе INSERT и передает NULL в списке значений, то будет сохраняться значение NULL или будет вызвано исключение для столбца, не допускающего пустое значение, независимо от наличия значения по умолчанию.

Атрибут NOT NULL

Включите этот атрибут в описание домена, если вы хотите, чтобы все столбцы, создаваемые на основе этого домена, имели непустое значение.

NULL - который является не значением, а состоянием, - всегда будет недопустимым для любого столбца, имеющего атрибут NOT NULL. Детальное обсуждение NULL см. в разд. "Рассмотрение NULL" главы 21.

! ! !

ВНИМАНИЕ! Вы не можете переопределить атрибут NOT NULL для домена. Рассмотрите преимущества невключения его в состав атрибутов домена, оставляя, таким образом, возможность добавить этот атрибут при определении столбца.

. ! .

Условия CHECK

Ограничение CHECK предоставляет атрибуты домена, ограничивающие содержимое данных, которое может быть сохранено в столбцах, использующих домен. Ограничение CHECK задает условие поиска (условие-поиска-домена), которое должно быть истинным до того, как данные могут быть помещены в эти столбцы.

Вот синтаксис ограничений CHECK:

<условие-поиска-домена> =

VALUE <оператор> <val>

| VALUE [NOT] BETWEEN <val> AND <val>

| VALUE [NOT] LIKE <val> [ESCAPE <val>]

| VALUE [NOT] IN (<val> [, <val> ...])

| VALUE IS [NOT] NULL

| VALUE [NOT] CONTAINING <val>

| VALUE [NOT] STARTING [WITH] <val>

I(<условие-поиска-домена>)

I NOT<условие-поиска-домена>

<условие-поиска-домена> OR <условие-поиска-домена>

| <условие-поиска-домена> AND <условие-поиска-домена>

<оператор> ={=|<|>I<=|>=|!<|!>|<>|!=}

Ключевое слово VALUE

VALUE является заполнителем для любой константы, значения переменной или результата выражения, которые могут быть подставлены в синтаксисе SQL для сохранения данных в столбце, использующем домен. Ограничение CHECK указывает, что VALUE должно проверяться на ограничения, определенные в условиях. Если проверка не соответствует, то вызывается исключение.

Если значение NULL допустимо, то правило должно учитывать этот факт в ограничении CHECK, например:

CHECK ((VALUE IS NULL) OR(VALUE > 1000));

Следующий оператор создает домен, который запрещает вводить значение 1000 и меньше, при этом он также неявно запрещает NULL во множестве допустимых значений:

CREATE DOMAIN CUSTNO

AS INTEGER

CHECK(VALUE > 1000);

Следующий оператор ограничивает VALUE одним из четырех заданных значений:

CREATE DOMAIN PRODTYPE

AS VARCHAR(8) NOT NULL

CHECK(VALUE IN ('software', 'hardware', 'other', 'N/A'));

Условие проверки может быть выполнено в виде поиска указанного шаблона во вводимой строке. Например, следующее правило проверяет наличие круглых скобок в коде региона (например, (09)438894749):

CREATE DOMAIN TEL_NUMBER

AS VARCHAR (18)

CHECK(VALUE LIKE '(0%)%');

Подробнее о строковых шаблонах, которые вы можете использовать в выражениях, см. в примечаниях к оператору LIKE в разд. "Операторы SQL" главы 21.

Множество условий CHECK

Домен может иметь только одно предложение CHECK, однако множество условий может быть включено в это предложение с помощью операторов AND (И - конъюнкция) и OR (ИЛИ - дизъюнкция). Позаботьтесь о необходимых скобках в выражениях условий, чтобы исключить получение логических исключений при подготовке оператора DDL.

1 ... 42 43 44 45 46 47 48 49 50 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий