FirebirdSQL logo

Домен (Domain) — один из объектов реляционной базы данных, при создании которого можно задать некоторые характеристики, а затем использовать ссылку на домен при определении столбцов таблиц, объявлении локальных переменных, входных и выходных аргументов в модулях PSQL.

В данном разделе рассматриваются синтаксис операторов создания, модификации и удаления доменов.Подробное описание доменов и их использования можно прочесть в главе Пользовательские типы данных — домены.

CREATE DOMAIN

Назначение

Создание нового домена.

Доступно в

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
Table 1. Параметры оператора CREATE DOMAIN
Параметр Описание

name

Имя домена.Может содержать до 63 символов.

datatype

Тип данных SQL.

literal

Литерал.

context_var

Любая контекстная переменная, тип которой совместим с типом данных домена.

dom_condition

Условие домена.

collation_name

Порядок сортировки.

charset

Набор символов.

select_one

Оператор SELECT выбирающий один столбец и возвращающий только одну строку.

select_list

Оператор SELECT выбирающий один столбец и возвращающий ноль и более строк.

select_expr

Оператор SELECT выбирающий несколько столбцов и возвращающий ноль и более строк.

expression

Выражение.

genname

Имя последовательности (генератора).

func

Скалярная функция.

Оператор CREATE DOMAIN создаёт новый домен.

В качестве базового типа домена можно указать любой тип данных SQL.

docnext count = 10

Детали для конкретного типа

Массивы
  • Если домен должен быть массивом, базовым типом может быть любой тип данных 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 могут:

Пользователь, создавший домен, становится его владельцем.

Примеры

Example 1. Создание домена, который может принимать значения больше 1000.
CREATE DOMAIN CUSTNO AS
INTEGER DEFAULT 10000
CHECK (VALUE > 1000);
Example 2. Создание домена, который может принимать значения 'Да' и 'Нет'.
CREATE DOMAIN D_BOOLEAN AS
CHAR(3) CHECK (VALUE IN ('Да', 'Нет'));
Example 3. Создание домена с набором символов UTF8 и порядком сортировки UNICODE_CI_AI.
CREATE DOMAIN FIRSTNAME AS
VARCHAR(30) CHARACTER SET UTF8
COLLATE UNICODE_CI_AI;
Example 4. Создание домена со значением по умолчанию.
CREATE DOMAIN D_DATE AS
DATE DEFAULT CURRENT_DATE
NOT NULL;
Example 5. Создание домена, определённого как массив из 2 элементов.

Создание домена, определённого как массив из 2 элементов типа NUMERIC(18, 3), нумерация элементов начинается с 1.

CREATE DOMAIN D_POINT AS
NUMERIC(18, 3) [2];
Note

Вы можете использовать домены определённые как массив только для определения столбцов таблиц.Вы не можете использовать такие домены для определения локальных переменных и аргументов PSQL модулей.

См. также:

ALTER DOMAIN, DROP DOMAIN.

ALTER DOMAIN

Назначение

Изменение текущих характеристик домена или его переименование.

Доступно в

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
Table 1. Параметры оператора ALTER DOMAIN
Параметр Описание

domain_name

Имя домена.

new_name

Новое имя домена.Может содержать до 63 символов.

datatype

Тип данных SQL.

literal

Литерал.

context_var

Любая контекстная переменная, тип которой совместим с типом данных домена.

dom_condition

Условие домена.

collation

Порядок сортировки.

select_one

Оператор SELECT выбирающий один столбец и возвращающий только одну строку.

select_list

Оператор SELECT выбирающий один столбец и возвращающий ноль и более строк.

select_expr

Оператор SELECT выбирающий несколько столбцов и возвращающий ноль и более строк.

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 DOMAIN могут:

Примеры

Example 1. Изменение значения по умолчанию для домена.
ALTER DOMAIN CUSTNO
INTEGER DEFAULT 2000;
Example 2. Переименование домена.
ALTER DOMAIN D_BOOLEAN TO D_BOOL;
Example 3. Удаление значения по умолчанию и добавления ограничения для домена.
ALTER DOMAIN D_DATE
DROP DEFAULT
ADD CONSTRAINT CHECK (VALUE >= date '01.01.2000');
Example 4. Изменение ограничения домена.
ALTER DOMAIN D_DATE
DROP CONSTRAINT;

ALTER DOMAIN D_DATE
ADD CONSTRAINT CHECK
(VALUE BETWEEN date '01.01.1900' AND date '31.12.2100');
Example 5. Изменение типа домена.
ALTER DOMAIN FIRSTNAME
TYPE VARCHAR(50) CHARACTER SET UTF8;
Example 6. Добавление ограничения NOT NULL для домена.
ALTER DOMAIN FIRSTNAME SET NOT NULL;
См. также:

CREATE DOMAIN, DROP DOMAIN.

DROP DOMAIN

Назначение

Удаление существующего домена.

Доступно в

DSQL, ESQL.

Синтаксис
DROP DOMAIN domain_name
Table 1. Параметры оператора DROP DOMAIN
Параметр Описание

domain_name

Имя домена.

Оператор DROP DOMAIN удаляет домен, существующий в базе данных.Невозможно удалить домен, на который ссылаются столбцы таблиц базы данных или если он был задействован в одном из PSQL модулей.Чтобы удалить такой домен, необходимо удалить из таблиц все столбцы, ссылающиеся на домен и удалить все ссылки на домен из PSQL модулей.

Кто может удалить домен?

Выполнить оператор DROP DOMAIN могут:

Примеры

Example 1. Удаление домена
DROP DOMAIN COUNTRYNAME;
См. также:

CREATE DOMAIN, ALTER DOMAIN.