Значение домен представляет собой пользовательский тип данных, основанный на другом базовом типе. При необходимости для него могут быть определены ограничения, сужающие набор допустимых значений относительно множества значений, разрешённых базовым типом. В остальном он ведет себя аналогично базовому типу — например, любые операторы или функции, применимые к базовому типу, будут работать и с типом-доменом. В качестве базового типа может выступать любой встроенный или пользовательский базовый тип, перечислимый тип, массив, составной тип, диапазон или другой домен.
Например, можно создать домен на базе целых чисел, допускающий только положительные значения:
CREATE DOMAIN posint AS integer CHECK (VALUE > 0); CREATE TABLE mytable (id posint); INSERT INTO mytable VALUES(1); -- работает INSERT INTO mytable VALUES(-1); -- ошибка
При применении оператора или функции базового типа к значению домена, тип-домен автоматически приводится к базовому типу. Так, например, результат выражения mytable.id - 1
будет иметь тип integer не integer.
Можно было бы написать (mytable.id - 1)::posint для приведения
результата обратно к integer, вызывая повторную проверку ограничений домена. В этом случае возникнет ошибка, если выражение будет применено к id значению,
равному 1. Допускается присваивание значения базового типа полю или переменной типа домена без явного указания приведения, при этом будут проверены ограничения домена.
Дополнительные сведения приведены в CREATE DOMAIN.