Un domaine est un type de données défini par l'utilisateur. Il est basé sur un autre type sous-jacent. En option, il peut avoir des contraintes qui restreignent les valeurs valides à un sous-ensemble de ce que permettrait le type sous-jacent. Pour le reste, il se comporte comme le type sous-jacent -- par exemple, tout opérateur ou fonction qui peut être appliqué au type sous-jacent fonctionne avec le domaine. Le type sous-jacent peut être tout type, interne ou défini par l'utilisateur, type enum, type tableau, type composé, type intervalle ou autre domaine.
Par exemple, nous pouvons créer un domaine sur des entiers qui n'accepte que des valeurs positives :
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
      
      Quand un opérateur ou une fonction du type sous-jacent est appliqué à la
      valeur d'un domaine, le domaine est automatiquement converti vers le type
      sous-jacent. Donc, par exemple, le résultat de mytable.id -
       1 est considéré être de type integer, et non pas
      posint. Nous pouvons écrire (mytable.id -
       1)::posint pour convertir le résultat avec le type
      posint, causant une nouvelle vérification des contraintes du
      domaine. Dans ce cas, cela résultera en une erreur si l'expression a été
      appliquée à une valeur de 1 pour id. Affecter
      une valeur du type sous-jacent à un champ ou variable du type domaine est
      autorisé sans forcer une conversion explicite, mais les contraintes du
      domaine seront vérifiées.
     
Pour plus d'informations, voir CREATE DOMAIN.