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.