PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :série vs identité

serial est la "vieille" implémentation des valeurs uniques générées automatiquement qui fait partie de Postgres depuis des lustres. Cependant, cela ne fait pas partie de la norme SQL.

Pour être plus conforme au standard SQL, Postgres 10 a introduit la syntaxe utilisant generated as identity .

L'implémentation sous-jacente est toujours basée sur une séquence, la définition est désormais conforme au standard SQL. Une chose que cette nouvelle syntaxe permet est d'empêcher un remplacement accidentel de la valeur.

Considérez les tableaux suivants :

create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);

Maintenant, lorsque vous exécutez :

insert into t1 (id) values (1);

La séquence sous-jacente et les valeurs du tableau ne sont plus synchronisées. Si vous exécutez un autre

insert into t1 default_values;

Vous obtiendrez une erreur car la séquence n'a pas été avancée par la première insertion, et essaie maintenant d'insérer la valeur 1 de nouveau.

Avec la deuxième table cependant,

insert into t2 (id) values (1);

Résultats en :

ERROR: cannot insert into column "id"
Detail: Column "id" is an identity column defined as GENERATED ALWAYS.

Ainsi, vous pouvez accidentellement "oublier" l'utilisation de la séquence. Vous pouvez toujours forcer cela, en utilisant le override system value choix :

insert into t2 (id) overriding system value values (1);

ce qui vous laisse toujours avec une séquence non synchronisée avec les valeurs du tableau, mais au moins vous en avez été informé.

Il est recommandé d'utiliser la nouvelle syntaxe d'identité plutôt que de série