Um domínio é um tipo de dados definido pelo usuário baseado em outro tipo de dados subjacente. Opcionalmente, esse tipo de dados pode ter restrições que restringem seus valores válidos a um subconjunto do que o tipo de dados subjacente permite. Caso contrário, se comporta como o tipo de dados subjacente — por exemplo, qualquer operador ou função que possa ser aplicado ao tipo de dados subjacente funciona no tipo de dados de domínio. O tipo de dados subjacente pode ser qualquer tipo de dados base nativo ou definido pelo usuário, tipo de dados enumeração, tipo de dados matriz, tipo de dados composto, tipo de dados de intervalo, ou outro domínio.
Por exemplo, pode-se criar um domínio sobre inteiros que aceita apenas inteiros positivos:
CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE minha_tabela (id posint);
INSERT INTO minha_tabela VALUES(1); -- funciona
INSERT INTO minha_tabela VALUES(-1); -- falha
ERRO: o valor para o domínio posint viola a restrição de verificação "posint_check"
Quando um operador ou função do tipo de dados subjacente é aplicado
a um valor de domínio, o domínio é automaticamente reduzido ao tipo
de dados subjacente. Assim, por exemplo, o resultado de
minha_tabela.id - 1 é considerado sendo do
tipo de dados integer, e não posint.
Poderia ser escrito (minha_tabela.id - 1)::posint
para converter o resultado de volta para posint,
fazendo com que as restrições do domínio fossem verificadas novamente.
Nesse caso, resultaria em erro se a expressão tivesse sido aplicada
a um id com valor 1.
É permitida a atribuição de um valor do tipo de dados subjacente a
um campo ou variável do tipo de dados de domínio sem escrever uma
conversão explícita, mas as restrições do domínio são verificadas.
Para informações adicionais veja CREATE DOMAIN.