C'est une limitation connue :les séquences sont incrémentées lors de l'appel du nextval()
fonction, qui est votre valeur par défaut de votre champ. Lorsque vous fournissez des données à INSERT
à ce champ, l'expression de la valeur par défaut n'est pas évaluée, c'est pourquoi la valeur de la séquence n'est pas touchée.
Une solution consiste à configurer un déclencheur avant/après INSERT
pour corriger manuellement la valeur de la séquence avec setval()
. Mais de cette façon, vous devriez besoin de configurer un déclencheur sur UPDATE
sur ce champ également, pour fixer la valeur de la séquence, lorsque vous mettez simplement à jour un identifiant existant vers un identifiant supérieur.
Une autre solution consiste à écrire une fonction stockée, qui peut produire une valeur disponible pour ce champ et définir la valeur par défaut de votre champ sur la valeur de retour de cette fonction. Quelque chose, comme :
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Mais attention :la fonctionnalité par défaut pour les séquences est sûre pour les insertions simultanées (l'état actuel de la séquence est global - indépendant de la transaction). Si vous fournissez des valeurs explicites à ces champs, ce ne sera pas le cas.