Les identifiants d'objets (OID) sont utilisés en interne par
PostgreSQL comme clés primaires de
différentes tables système. Les OID ne sont pas ajoutés aux tables
utilisateur à moins que WITH OIDS
ne soit indiqué
lors de la création de la table ou que la variable de configuration
default_with_oids ne soit activée. Le type oid
représente un identifiant d'objet. Il existe également différents types
alias du type oid
: regproc
, regprocedure
,
regoper
, regoperator
, regclass
,
regtype
, regrole
, regnamespace
,
regconfig
et regdictionary
.
Le Tableau 8.24 en donne un aperçu.
Le type oid
est à ce jour un entier non signé sur quatre octets.
Il n'est, de ce fait, pas suffisamment large pour garantir l'unicité au
sein d'une base de données volumineuse, voire au sein d'une très
grosse table. Il est donc déconseillé d'utiliser une colonne OID comme clé
primaire d'une table utilisateur. Les OID sont avant tout destinés à
stocker des références vers les tables système.
Le type oid
lui-même dispose de peu d'opérations en dehors de la
comparaison. Il peut toutefois être converti en entier (integer)
et manipulé par les opérateurs habituels des entiers
(attention aux possibles confusions entre les entiers signés et non
signés dans ce cas).
Les types alias d'OID ne disposent pas d'opérations propres à
l'exception des routines spécialisées de saisie et d'affichage.
Ces routines acceptent et affichent les noms symboliques des objets système,
plutôt que la valeur numérique brute que le type oid
utilise. Les types alias permettent de simplifier la recherche des
valeurs OID des objets. Par exemple, pour examiner les lignes
pg_attribute
en relation avec une table
ma_table
, on peut écrire :
SELECT * FROM pg_attribute WHERE attrelid = 'ma_table'::regclass;
plutôt que :
SELECT * FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'ma_table');
Bien que cela semble une bonne solution, c'est un peu trop simplifié.
Un sous-select bien plus compliqué peut être nécessaire pour sélectionner
le bon OID s'il existe plusieurs tables nommées ma_table
dans
différents schémas. Le convertisseur de saisie regclass
gère la
recherche de la table en fonction du paramétrage du parcours des schémas et
effectue donc la « bonne recherche » automatiquement. De façon
similaire, la conversion d'un OID de table en regclass
pour l'affichage d'un OID numérique est aisée.
Tableau 8.24. Types identifiant d'objet
Nom | Référence | Description | Exemple |
---|---|---|---|
oid | tous | identifiant d'objet numérique | 564182 |
regproc | pg_proc | nom de fonction | sum |
regprocedure | pg_proc | fonction avec types d'arguments | sum(int4) |
regoper | pg_operator | nom d'opérateur | + |
regoperator | pg_operator | opérateur avec types d'arguments | *(integer,integer) ou -(NONE,integer) |
regclass | pg_class | nom de relation | pg_type |
regtype | pg_type | nom de type de données | integer |
regrole | pg_authid | nom de rôle | smithee |
regnamespace | pg_namespace | nom de schéma | pg_catalog |
regconfig | pg_ts_config | configuration de la recherche plein texte | english |
regdictionary | pg_ts_dict | dictionnaire de la recherche plein texte | simple |
Tous les types alias d'OID pour des objets groupés par schéma acceptent
des noms qualifiés par le schéma,
et affichent des noms préfixés par un schéma si l'objet ne peut être
trouvé dans le chemin de recherche courant sans être qualifié.
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
et
regoperator
sont plus appropriés. Pour regoperator
,
les opérateurs unaires sont identifiés en écrivant NONE
pour
les opérandes non utilisés.
Une propriété supplémentaire de pratiquement tous les types alias d'OID est la création de
dépendances. Si une
constante d'un de ces types apparaît dans une expression stockée
(telle que l'expression par défaut d'une colonne ou une vue), elle crée une
dépendance sur l'objet référencé. Par exemple, si une colonne a une
expression par défaut nextval('ma_seq'::regclass)
,
PostgreSQL comprend que l'expression par
défaut dépend de la séquence ma_seq
; le système ne
permet alors pas la suppression de la séquence si l'expression par défaut
n'est pas elle-même supprimée au préalable. regrole
est la
seule exception. Les constantes de ce type ne sont pas autorisées dans ce
type d'expressions.
Les types d'alias d'OID ne suivent pas complètement les règles d'isolation des transactions. Le planificateur les traite aussi comme de simples constantes, ce qui pourrait résulter en une planification non optimale.
Un autre type d'identifiant utilisé par le système est xid
, ou
identifiant de transaction (abrégée xact).
C'est le type de données des colonnes système xmin
et
xmax
. Les identifiants de transactions sont
stockés sur 32 bits.
Un troisième type d'identifiant utilisé par le système est cid
,
ou identifiant de commande. C'est le type de données des colonnes système
cmin
et cmax
.
Les identifiants de commandes sont aussi stockés sur 32 bits.
Le dernier type d'identifiant utilisé par le système est tid
,
ou identifiant de ligne (tuple). C'est le type de données
des colonnes système ctid
. Un identifiant de 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ème sont expliquées plus en détail dans la Section 5.4.