Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
* CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME или предварительно определенный литерал даты Firebird (см. главу 10);
* USER, CURRENT_USER или CURRENT_ROLE (если применяются роли);
* CURRENT_CONNECTION или CURRENT_TRANSACTION.
! ! !
ПРИМЕЧАНИЕ. Возможно указание в качестве значения по умолчанию NULL. Хотя это излишне, поскольку столбцы, допускающие пустое значение, в любом случае инициализируются по умолчанию значением NULL. Более того, явное указание значения по умолчанию 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:
<условие-поиска-домена> =
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 является заполнителем для любой константы, значения переменной или результата выражения, которые могут быть подставлены в синтаксисе 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.