8.12. Types identifiants d'objets

Les identifiants d'objets (OID) sont utilisés en interne par PostgreSQL comme clés primaires de différentes tables système. De plus, une colonne système OID est ajoutée aux tables créées par les utilisateurs sauf si WITHOUT OIDS est indiqué à la création de la table ou quand la variable de configuration default_with_oids est configurée à false. Le type oid représente un identificateur d'objet Il a aussi différents types alias : regproc, regprocedure, regoper, regoperator, regclass, et regtype. Tableau 8-19 donne un aperçu.

Le type oid est actuellement un entier de quatre octets. Du coup, il n'est pas suffisamment grand garantir l'unicité dans une grosse base de données, où même dans une très grosse table. Du coup, l'utilisation d'une colonne OID comme clé primaire d'une table créée par un utilisateur est déconseillée. Les OID surtout destinés à être des références vers les tables système.

Note : Les OID sont inclus par défaut dans les tables créées par un utilisateur dans PostgreSQL 8.0.25. Néanmoins, ce comportement est amené à changer dans une future version de PostgreSQL. Éventuellement, les tables créées par un utilisateur n'incluront pas de colonne système OID sauf si WITH OIDS est spécifié lors de la création de la table ou lorsque la variable de configuration default_with_oids est initialisée à true. Si votre application requiert la présence d'une colonne système OID dans une table, elle devrait indiquer WITH OIDS lors de la création de la table pour s'assurer de sa compatibilité avec les prochaines versions de PostgreSQL.

Le type oid lui même dispose de peu d'opérations à part la comparaison. Néanmoins, il peut être transtypé en entier (integer) et manipulé en utilisant les opérateurs habituels des entiers. (Attention aux possibles confusions entre les entiers signés et non signés si vous le faites.)

Les types alias de l'OID n'ont pas d'opérations à eux sauf pour les routines spécialisées en entrée et en sortie. Ces routines sont capables d'accepter et d'afficher des noms symboliques pour les objets systèmes, plutôt que la valeur numérique brute que le type oid utiliserait. Les types alias permettent de simplifier la recherche des valeurs OID pour les objets. Par exemple, pour examiner les lignes pg_attribute en relation avec une table matable, vous pourriez écrire

SELECT * FROM pg_attribute WHERE attrelid = 'matable'::regclass;

plutôt que

SELECT * FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'matable');

Bien que cela ne semble pas si difficile, c'est toujours trop simplifié. Une sous-sélection bien plus compliqué serait nécessaire pour sélectionner le bon OID s'il existait plusieurs tables nommées matable dans différents schémas. Le convertisseur d'entrées regclass gère la recherche de la table suivant le paramétrage du chemin des schémas et il fera donc la << bonne recherche >> automatiquement. De façon similaire, convertir une OID d'une table en regclass est facile pour l'affichage symbolique d'un OID numérique.

Tableau 8-19. Types identifiants d'objet

NomRéférenceDescriptionExemple
oidtousidentifiant d'objet numérique564182
regprocpg_procnom de fonctionsum
regprocedurepg_procfonction avec les types d'argumentssum(int4)
regoperpg_operatornom d'opérateur+
regoperatorpg_operatoropérateur avec types d'arguments*(integer,integer) ou -(NONE,integer)
regclasspg_classnom de relationpg_type
regtypepg_typenom de type de donnéesinteger

Tous les types alias d'OID acceptent des noms avec un préfixe de schéma, et affichent des noms préfixés par un schémas si l'objet ne peut être trouvé dans le chemin de recherche courant sans préfixe de schéma. Les types alias regproc et regoper n'acceptent que des noms uniques en entrée (sans surcharge), si bien qu'ils sont d'un usage limité. Dans la plupart des cas, regprocedure ou regoperator sont plus appropriés. Pour regoperator, les opérateurs unaires sont identifiés en écrivant NONE pour les opérandes non utilisés.

Un autre type identifiant utilisé par le système est xid, ou identifiant (abrégé xact) de transaction. C'est le type de données des colonnes systèmes xmin et xmax. Les identifiants de transactions sont des quantités sur 32 bits.

Un troisième type identifiant utilisé par le système est cid, ou identifiant de commande. C'est le type de données des colonnes systèmes cmin et cmax. Les identifiants de commandes sont aussi des quantités sur 32 bits.

Un dernier type identifiant utilisé par le système est tid, ou identifiant de tuple (identifiant de ligne). C'est le type de données des colonnes système ctid. Un tuple est une paire (numéro de bloc, index de tuple dans le bloc) qui identifie l'emplacement physique de la ligne dans sa table.

(Les colonnes systèmes sont expliquées plus en détail dans Section 5.4.)