PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/05/2023 17:06:21

Xavier_WX
Membre

sequence pour generer une cle primaire - creation a posteriori ...

Bonjour,
Je suis en train de reprendre une base dans laquelle il manquait la déclaration d'une clé primaire dans une table. (le champ existait mais sans être déclaré comme clé primaire)
J'ai donc créé défini clé primaire, et je souhaite maintenant qu'il y ait une incrémentation automatique de ma clé lors d'un nouvel ajout.
Je pense donc créer une séquence CREATE SEQUENCE ma_nouvelle_sequence
suivi d'un ALTER TABLE ma_table (cle_primaire  DEFAULT nextval('ma_nouvelle_sequence'));

J'aurais aimé être certain que la séquence 'ma_nouvelle_sequence' ne va pas chercher à créer des valeurs de clé primaire déjà existantes ? Même si d'après ma modeste expérience de base de données, j'imagine que le système va chercher une autre clé primaire en cas de conflit ?... ou bien ça bloque la nouvelle insertion ?

Merci,
Xavier

Hors ligne

#2 16/05/2023 02:34:18

rjuju
Administrateur

Re : sequence pour generer une cle primaire - creation a posteriori ...

Bonjour,


Si vous ne faites que créer une séquence, celle-ci va générer des valeurs en partant de 1.  Il vous faut donc assigner la valeur courante en fonction de la valeur maximum de la table en utilisant setval() (voir https://www.postgresql.org/docs/current … uence.html ), idéalement en détenant un verrou exclusif sur la table afin d'éviter des problème en cas d'insertion concurrente.


J'aurais aimé être certain que la séquence 'ma_nouvelle_sequence' ne va pas chercher à créer des valeurs de clé primaire déjà existantes ? Même si d'après ma modeste expérience de base de données, j'imagine que le système va chercher une autre clé primaire en cas de conflit ?... ou bien ça bloque la nouvelle insertion ?

Une séquence ne fait que fournir des entiers strictement croissants, si l'entier fourni existe déjà dans une table vous aurez donc une erreur pour cause de violation de contrainte s'il s'agit d'une clé primaire de la même manière que si vous assigniez la valeur manuellement.  Je suis d'ailleurs assez dubitatif sur votre choix d'utiliser une séquence après coup pour un champ existant.  À priori l'applicatif fournit lui même une valeur, donc sans modification de tout le code qui peut insérer dans cette table la séquence ne sera jamais utilisée.  De plus, si vous ne modifiez qu'une partie du code client il est possible que des valeurs soient insérées manuellement sans passer par la séquence, ce qui mènera a une erreur à la prochaine insertion effecutée avec la séquence utilisée en valeur par défaut.

Hors ligne

#3 16/05/2023 11:44:51

genamiga
Membre

Re : sequence pour generer une cle primaire - creation a posteriori ...

Bonjour,


Pour info, il me semble qu'avec une SEQUENCE, la valeur créer est perdue si l'insertion échoue.

Exemple :

nextval = 10

Tentative d'INSERT avec 10

nextval passe à 11 même si l'INSERT échoue

Et l'INSERT suivant sera tenté avec 12

Hors ligne

#4 17/05/2023 06:49:56

rjuju
Administrateur

Re : sequence pour generer une cle primaire - creation a posteriori ...

Oui c'est le comportement normal : la séquence n'est pas transactionnelle.  Autrement il serait impossible de garantir des valeurs strictement monotones.

Hors ligne

Pied de page des forums