Une colonne d'identité est une colonne spéciale qui est générée automatiquement à partir d'une séquence implicite. Elle peut être utilisée pour générer des valeurs de clé.
Pour créer une colonne d'identité, utilisez la clause GENERATED ...
AS IDENTITY
de la commande CREATE TABLE
, par
exemple :
CREATE TABLE people (
id bigint GENERATED ALWAYS AS IDENTITY,
...,
);
ou sinon :
CREATE TABLE people (
id bigint GENERATED BY DEFAULT AS IDENTITY,
...,
);
Voir CREATE TABLE pour plus de détails.
Si une commande INSERT
est exécutée sur la table contenant
une colonne d'identité et qu'aucune valeur n'est explicitement indiquée pour
la colonne d'identité, alors une valeur générée par la séquence implicite est
insérée. Par exemple, avec les définitions ci-dessus et en supposant les
colonnes appropriées supplémentaires, écrire
INSERT INTO people (name, address) VALUES ('A', 'foo'); INSERT INTO people (name, address) VALUES ('B', 'bar');
génèrera des valeurs pour la colonne id
en commençant par
la valeur 1 et résultera en les données suivantes pour la table :
id | name | address ----+------+--------- 1 | A | foo 2 | B | bar
Il est aussi possible d'indiquer le mot clé DEFAULT
à la
place d'une valeur pour demander explicitement une valeur générée par la
séquence, par exemple :
INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');
De façon similaire, le mot clé DEFAULT
peut être utilisé
dans les commandes UPDATE
.
De ce fait, en de nombreuses façons, une colonne d'identité se comporte comme une colonne avec une valeur par défaut.
Les clauses ALWAYS
et BY DEFAULT
dans
la définition de la colonne déterminent comment sont gérées les valeurs
explicitement définies par l'utilisateur dans des commandes
INSERT
et UPDATE
. Dans une commande
INSERT
, si ALWAYS
est indiqué, une
valeur indiqué par l'utilisateur est uniquement acceptée si la commande
INSERT
indique OVERRIDING SYSTEM VALUE
.
Si BY DEFAULT
est sélectionné, alors la valeur indiquée
par l'utilisateur fait priorité. Donc, utiliser BY DEFAULT
revient à un comportement similaire aux valeurs par défaut, où la valeur par
défat peut être surchargée par une valeur explicite, alors que
ALWAYS
fournit plus de protection contre l'insertion
accidentelle d'une valeur explicite.
Le type de données d'une colonne identité doit être un type de données accepté par les séquences. (Voir CREATE SEQUENCE.) Les propriétés de la séquence associée peuvent être indiquées lors de la création d'une colonne d'identité (voir CREATE TABLE) ou modifiées après coup (voir ALTER TABLE).
Une colonne d'identité est automatiquement marquée comme NOT
NULL
. Néanmoins, une colonne d'identité ne garantie par l'unicité.
(Une séquence renvoie normalement des valeurs uniques mais une séquence peut
être réinitialisée ou des valeurs peuvent être insérées manuellement dans
la colonne d'identité, comme discuté ci-dessus.) L'unicité doit être forcée
en utilisant une contrainte de type PRIMARY KEY
ou
UNIQUE
.
Dans les hiérarchies d'héritages, les colonnes d'identité et leurs propriétés
sont indépendantes de celles des tables parents. Une table enfant ne peut
pas hériter des colonnes d'identité ou de leurs propriétés automatiquement du
parent. Lors d'une commande INSERT
ou
UPDATE
, une colonne est traitée comme une colonne
d'identité si cette colonne est une colonne d'identité dans la table nommée
dans la commande. Dans ce cas, les propriétés de la colonne correspondante
sont appliquées.
Les partitions héritent des colonnes d'identité de la table partitionnée. Elles ne peuvent pas avoir leur propres colonnes d'identité. Les propriétés d'une colonne d'identité donnée sont cohérentes sur toutes les partitions d'une hiérarchie de partitions.