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.