Vous n'êtes pas identifié(e).
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
Oui c'est le comportement normal : la séquence n'est pas transactionnelle. Autrement il serait impossible de garantir des valeurs strictement monotones.
Julien.
https://rjuju.github.io/
Hors ligne