PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Langage SQL » Définition des données » Colonnes d'identité

5.3. Colonnes d'identité #

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.