8.18. Типы доменов#

8.18. Типы доменов

8.18. Типы доменов

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

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

CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE mytable (id posint);
INSERT INTO mytable VALUES(1);   -- works
INSERT INTO mytable VALUES(-1);  -- fails

Когда оператор или функция базового типа применяется к значению домена, домен автоматически приводится к базовому типу. Таким образом, например, результат выражения mytable.id - 1 считается типом integer, а не posint. Мы можем написать (mytable.id - 1)::posint, чтобы привести результат обратно к типу posint и проверить ограничения домена. В этом случае возникнет ошибка, если выражение было применено к значению id равному 1. Присваивание значения базового типа полю или переменной типа домена разрешено без явного приведения типа, но будут проверены ограничения домена.

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