Типы доменов

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

Например, можно создать домен поверх целых чисел, принимающий только положительные целые числа:

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, а не posint. Мы могли бы написать (mytable.id - 1)::posint, чтобы привести результат обратно к posint, вызвав перепроверку ограничений домена. В этом случае, если выражение было применено к значению id, равному 1, произойдет ошибка. Допускается присвоение значения нижележащего типа полю или переменной типа домена без написания явного приведения, но ограничения домена все равно будут проверены.

Дополнительную информацию см. в описании команды CREATE DOMAIN.