Домен (Domain) — один из объектов реляционной базы данных, при создании которого можно задать некоторые характеристики, а затем использовать ссылку на домен при определении столбцов таблиц, объявлении локальных переменных, входных и выходных аргументов в модулях PSQL.
В данном разделе рассматриваются синтаксис операторов создания, модификации и удаления доменов. Подробное описание доменов и их использования можно прочесть в главе Пользовательские типы данных — домены.
Создание нового домена.
DSQL, ESQL.
CREATE DOMAIN name [AS] <datatype> [DEFAULT {<literal> | NULL | <context_var>}] [NOT NULL] [CHECK (<dom_condition>)] [COLLATE collation_name]; <datatype> ::= <scalar_datatype> | <blob_datatype> | <array_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <array_datatype> ::= См. Синтаксис массивов <dom_condition> ::= <val> <operator> <val> | <val> [NOT] BETWEEN <val> AND <val> | <val> [NOT] IN (<val> [, <val> ...] | <select_list>) | <val> IS [NOT] NULL | <val> IS [NOT] DISTINCT <val> | <val> IS [NOT] {TRUE | FALSE | UNKNOWN} | <val> [NOT] CONTAINING <val> | <val> [NOT] STARTING [WITH] <val> | <val> [NOT] LIKE <val> [ESCAPE <val>] | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>] | <val> <operator> {ALL | SOME | ANY} (<select_list>) | [NOT] EXISTS (<select_expr>) | [NOT] SINGULAR (<select_expr>) | (<dom_condition>) | NOT <dom_condition> | <dom_condition> OR <dom_condition> | <dom_condition> AND <dom_condition> <operator> ::= <> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~> <val> ::= { VALUE | <literal> | <context_var> | <expression> | NULL | NEXT VALUE FOR genname | GEN_ID(genname, <val>) | CAST(<val> AS <cast_type>) | (<select_one>) | func(<val> [, <val> ...]) } <cast_type> ::= <datatype> | [TYPE OF] domain | TYPE OF COLUMN rel.col
CREATE DOMAIN
Параметр | Описание |
---|---|
name |
Имя домена. Может содержать до 63 символов. |
datatype |
Тип данных SQL. |
literal |
Литерал. |
context_var |
Любая контекстная переменная, тип которой совместим с типом данных домена. |
dom_condition |
Условие домена. |
collation_name |
Порядок сортировки. |
charset |
Набор символов. |
select_one |
Оператор |
select_list |
Оператор |
select_expr |
Оператор |
expression |
Выражение. |
genname |
Имя последовательности (генератора). |
func |
Скалярная функция. |
Оператор CREATE DOMAIN
создаёт новый домен.
В качестве базового типа домена можно указать любой тип данных SQL.
- Массивы
-
-
Если домен должен быть массивом, базовым типом может быть любой тип данных SQL, кроме BLOB и массива.
-
Размеры массива указаны в квадратных скобках. (В синтаксисе эти скобки заключены в кавычки, чтобы отличать их от квадратных скобок, обозначающих необязательные элементы синтаксиса).
-
Для каждого измерения массива указывается одно или два целых числа, которые определяют нижнюю и верхнюю границы диапазона индекса:
-
По умолчанию массивы начинаются с 1. Нижняя граница является неявной, и необходимо указать только верхнюю границу. Когда указано только одно число меньше 1, то это определяет диапазон num .. 1, а число больше 1 определяет диапазон 1 .. num.
-
Когда указано два числа, разделенных двоеточием (‘
:
’) и необязательный пробел, то если второе большее, чем первое, это явно определяет диапазон индексов. Одна или обе границы могут быть меньше нуля, если верхняя граница больше нижней.
-
-
Если массив имеет несколько измерений, определения диапазонов для каждого измерения должны быть разделены запятыми и необязательными пробелами.
-
Индексы проверяются только, если значение массива действительно существует.
-
Это означает, что сообщения об ошибках относительно недопустимых индексов не будут возвращаться, если выбор конкретного элемента массива ничего не вернет или если поле массива имеет значение
NULL
.
-
- Строковые типы
-
Для типов
CHAR
,VARCHAR
иBLOB
с подтипом text можно указать набор символов в предложенииCHARACTER SET
. Если набор символов не указан, то по умолчанию принимается тот набор символов, который был указан при создании базы данных.WarningЕсли же при создании базы данных не был указан набор символов, то при создании домена по умолчанию принимается набор символов NONE. В этом случае данные хранятся и извлекаются, так как они были поданы. В столбец, основанный на таком домене, можно загружать данные в любой кодировке, но невозможно загрузить эти данные в столбец с другой кодировкой. Транслитерация не выполняется между исходными и конечными кодировками, что может приводить к ошибкам.
- Предложение
DEFAULT
-
Необязательное предложение
DEFAULT
позволяет указать значение по умолчанию для домена. Это значение будет помещено в столбец таблицы, который ссылает на данный домен, при выполнении оператораINSERT
, если значение не будет указано для этого столбца. Локальные переменные и аргументы PSQL модулей, которые ссылаются на этот домен, будут инициализированы значением по умолчанию. В качестве значения по умолчанию может быть литерал совместимый по типу, неизвестное значение NULL и контекстная переменная, тип которой совместим с типом домена. - Ограничение
NOT NULL
-
Предложение
NOT NULL
запрещает столбцам и переменным, основанным на домене, присваивать значение NULL. - Ограничение
CHECK
-
Необязательное предложение
CHECK
задаёт ограничение домена. Ограничение домена задаёт условия, которому должны удовлетворять значения столбцов таблицы или переменных, которые ссылаются на данный домен. Условие должно быть помещено в круглые скобки. Условие — это логическое выражение, называемое также предикат, которое может возвращать значения TRUE (истина), FALSE (ложь) и UNKNOWN (неизвестно). Условие считается выполненным, если предикат возвращает значение TRUE или UNKNOWN (эквивалент NULL). Если предикат возвращает FALSE, то значение не будет принято. - Ключевое слово
VALUE
-
Ключевое слово
VALUE
в ограничении домена является заменителем столбца таблицы, который основан на данном домене, или переменной PSQL модуля. Оно содержит значение, присваиваемое переменной или столбцу таблицы. Ключевое слово VALUE может быть использовано в любом месте ограниченияCHECK
, но обычно его используют в левой части условия. COLLATE
-
Необязательное предложение
COLLATE
позволяет задать порядок сортировки, если домен основан на одном из строковых типов данных (за исключениемBLOB
). Если порядок сортировки не указан, то по умолчанию принимается порядок сортировки умалчиваемый для указанного набора сортировки при создании домена.
Выполнить оператор CREATE DOMAIN
могут:
-
Пользователи с привилегией
CREATE DOMAIN
.
Пользователь, создавший домен, становится его владельцем.
CREATE DOMAIN CUSTNO AS
INTEGER DEFAULT 10000
CHECK (VALUE > 1000);
CREATE DOMAIN D_BOOLEAN AS
CHAR(3) CHECK (VALUE IN ('Да', 'Нет'));
UTF8
и порядком сортировки UNICODE_CI_AI
.CREATE DOMAIN FIRSTNAME AS
VARCHAR(30) CHARACTER SET UTF8
COLLATE UNICODE_CI_AI;
CREATE DOMAIN D_DATE AS
DATE DEFAULT CURRENT_DATE
NOT NULL;
Создание домена, определённого как массив из 2 элементов типа NUMERIC(18, 3), нумерация элементов начинается с 1.
CREATE DOMAIN D_POINT AS
NUMERIC(18, 3) [2];
Note
|
Вы можете использовать домены определённые как массив только для определения столбцов таблиц. Вы не можете использовать такие домены для определения локальных переменных и аргументов PSQL модулей. |
Изменение текущих характеристик домена или его переименование.
DSQL, ESQL.
ALTER DOMAIN domain_name [TO new_name] [TYPE <datatype>] [{SET DEFAULT {<literal> | NULL | <context_var>}} | DROP DEFAULT] [{SET | DROP} NOT NULL] [{ADD [CONSTRAINT] CHECK (<dom_condition>)} | DROP CONSTRAINT] <datatype> ::= <scalar_datatype> | <blob_datatype> | <array_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <array_datatype> ::= См. Синтаксис массивов <dom_condition> ::= <val> <operator> <val> | <val> [NOT] BETWEEN <val> AND <val> | <val> [NOT] IN (<val> [, <val> ...] | <select_list>) | <val> IS [NOT] NULL | <val> IS [NOT] DISTINCT <val> | <val> IS [NOT] {TRUE | FALSE | UNKNOWN} | <val> [NOT] CONTAINING <val> | <val> [NOT] STARTING [WITH] <val> | <val> [NOT] LIKE <val> [ESCAPE <val>] | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>] | <val> <operator> {ALL | SOME | ANY} (<select_list>) | [NOT] EXISTS (<select_expr>) | [NOT] SINGULAR (<select_expr>) | (<dom_condition>) | NOT <dom_condition> | <dom_condition> OR <dom_condition> | <dom_condition> AND <dom_condition> <operator> ::= <> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~> <val> ::= VALUE | <literal> | <context_var> | <expression> | NULL | NEXT VALUE FOR genname | GEN_ID(genname, <val>) | CAST(<val> AS <cast_type>) | (<select_one>) | func(<val> [, <val> ...]) <cast_type> ::= <datatype> | [TYPE OF] domain | TYPE OF COLUMN rel.col
ALTER DOMAIN
Параметр | Описание |
---|---|
domain_name |
Имя домена. |
new_name |
Новое имя домена. Может содержать до 63 символов. |
datatype |
Тип данных SQL. |
literal |
Литерал. |
context_var |
Любая контекстная переменная, тип которой совместим с типом данных домена. |
dom_condition |
Условие домена. |
collation |
Порядок сортировки. |
select_one |
Оператор |
select_list |
Оператор |
select_expr |
Оператор |
expression |
Выражение. |
genname |
Имя последовательности (генератора). |
func |
Скалярная функция. |
Оператор ALTER DOMAIN
изменяет текущие характеристики домена, в том числе и его имя.
В одном операторе ALTER DOMAIN
можно выполнить любое количество изменений домена.
TO name
-
Предложение TO позволяет переименовать домен. Имя домена можно изменить, если не существует зависимостей от этого домена, т.е. столбцов таблиц, локальных переменных и аргументов процедур, ссылающихся на данный домен.
SET DEFAULT
-
Предложение
SET DEFAULT
позволяет установить новое значение по умолчанию. Если домен уже содержал значение по умолчанию, то установка нового значения по умолчанию не требует предварительного удаления старого. DROP DEFAULT
-
Предложение
DROP DEFAULT
удаляет ранее установленное для домена значение по умолчанию. В этом случае значением по умолчанию становится значение NULL. ADD CONSTRAINT CHECK
-
Предложение
ADD [CONSTRAINT] CHECK
добавляет условие ограничения домена. Если домен уже содержал ограничениеCHECK
, то его предварительно необходимо удалить с помощью предложенияDROP CONSTRAINT
. TYPE
-
Предложение
TYPE
позволяет изменить тип домена на другой допустимый тип. Не допустимы любые изменения типа, которые могут привести к потере данных. Например, количество символов в новом типе для домена не может быть меньше, чем было установлено ранее.NoteИзменение типа не поддерживается для типа BLOB и массивов.
SET NOT NULL
-
Предложение
SET NOT NULL
устанавливает ограничение NOT NULL для домена. В этом случае для переменных и столбцах базирующихся на домене значение NULL не допускается.NoteУспешная установка ограничения NOT NULL для домена происходит только после полной проверки данных таблиц, столбцы которых базируются на домене. Это может занять довольно длительное время.
WarningПри изменении описания домена, существующий PSQL код, может стать некорректным. Информация о том, как это обнаружить, находится в приложении Поле RDB$VALID_BLR.
DROP NOT NULL
-
Предложение
DROP NOT NULL
удаляет ограничениеNOT NULL
для домена.
-
Если домен был объявлен как массив, то изменить ни его тип, ни размерность нельзя. Также нет возможности изменить любой другой тип на тип массив.
-
Не существует способа изменить сортировку по умолчанию. В этом случае необходимо удалить домен и пересоздать его с новыми атрибутами.
Выполнить оператор ALTER DOMAIN
могут:
-
Владелец домена;
-
Пользователи с привилегией
ALTER ANY DOMAIN
.
ALTER DOMAIN CUSTNO
INTEGER DEFAULT 2000;
ALTER DOMAIN D_BOOLEAN TO D_BOOL;
ALTER DOMAIN D_DATE
DROP DEFAULT
ADD CONSTRAINT CHECK (VALUE >= date '01.01.2000');
ALTER DOMAIN D_DATE
DROP CONSTRAINT;
ALTER DOMAIN D_DATE
ADD CONSTRAINT CHECK
(VALUE BETWEEN date '01.01.1900' AND date '31.12.2100');
ALTER DOMAIN FIRSTNAME
TYPE VARCHAR(50) CHARACTER SET UTF8;
ALTER DOMAIN FIRSTNAME SET NOT NULL;
Удаление существующего домена.
DSQL, ESQL.
DROP DOMAIN domain_name
DROP DOMAIN
Параметр | Описание |
---|---|
domain_name |
Имя домена. |
Оператор DROP DOMAIN
удаляет домен, существующий в базе данных.
Невозможно удалить домен, на который ссылаются столбцы таблиц базы данных или если он был задействован в одном из PSQL модулей.
Чтобы удалить такой домен, необходимо удалить из таблиц все столбцы, ссылающиеся на домен и удалить все ссылки на домен из PSQL модулей.
Выполнить оператор DROP DOMAIN
могут:
-
Владелец домена;
-
Пользователи с привилегией
DROP ANY DOMAIN
.
DROP DOMAIN COUNTRYNAME;