8.12. Types identifiant d'objet
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 et
regtype. Le Tableau 8.19,
« Types identifiant d'objet » 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 même 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èmes, 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.19. 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
|
Tous les types alias d'OID 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 des types alias d'OID est que, 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.
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èmes
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èmes sont expliquées plus en détail dans la
Section 5.4, « Colonnes
système ».