8.18. Tipos de dominios #

Un dominio es un tipo de datos definido por el usuario que se basa en otro tipo subyacente. Opcionalmente, puede tener restricciones que limiten sus valores válidos a un subconjunto de lo que permitiría el tipo subyacente. De lo contrario, se comporta como el tipo subyacente — por ejemplo, cualquier operador o función que pueda aplicarse al tipo subyacente funcionará en el tipo de dominio. El tipo subyacente puede ser cualquier tipo base integrado o definido por el usuario, tipo enum, tipo de arreglo, tipo compuesto, tipo de rango u otro dominio.

Por ejemplo, podríamos crear un dominio sobre enteros que acepte únicamente enteros positivos:

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

Cuando se aplica un operador o función del tipo subyacente a un valor de dominio, el dominio se convierte automáticamente (down-cast) al tipo subyacente. Así, por ejemplo, el resultado de mytable.id - 1 se considera de tipo integer y no posint. Podríamos escribir (mytable.id - 1)::posint para convertir el resultado de vuelta a posint, lo que provocaría que las restricciones del dominio se vuelvan a comprobar. En este caso, eso resultaría en un error si la expresión se hubiera aplicado a un valor de id de 1. Se permite asignar un valor del tipo subyacente a un campo o variable del tipo de dominio sin escribir una conversión explícita, pero se comprobarán las restricciones del dominio.

Para obtener información adicional, consulta la CREATE DOMAIN.