-
Séquence sans trou
Bonjour,
Une confirmation ....
Je voulais créer une séquence pour générer un id. mais si l'insertion plante et déclenche un rollback, la numérotation n'est plus séquentielle.
J'ai donc abandonné l'idée de la séquence et je vais générer l'id par trigger max(id)+1
Est-ce une bonne solution ou bien y a-t-il un moyen que je ne connais pas d'annuler la délivrance du dernier nombre renvoyé ? Pas possible dans ce contexte d'utiliser currval.
Merci pour les réponses
-
La séquence vous garantit un id unique qui va s'incrémenter, mais en effet elle peut comporter des trous pour par exemple la raison que vous avez évoquée.
Le select max(id)+1 ne vous garantit ni id unique, ni concurrence d'écriture sur votre table.
La question revient régulièrement, la réponse est souvent la même : en quoi le fait d'avoir des trous pose-t-il problème ?
-
Merci pour la réponse.
Dans mon cas, cela me permettrait d'éviter une colonne numordre pour ordonner mes lignes et pouvoir écrire un programme de séances comme suit :
séance 1 : les triggers oracle
séance 2 : les séquences oracle
séance 3 : les vues oracle
.....
scéance 1 : le 1 serait l'id de la table sceance
Merci pour les conseils.
Par ailleurs j'utilise des séquences et les éventuels trous ne me dérangent pas.
-
Bonjour,
Une solution possible est de remplacer le séquenceur par une valeur stockée dans une table "A", de verrouiller la données avant lecture et d'intégrer sa mise à jour (max + 1) à la transaction d'insertion de la table de données "B".
bien sûr, cela suppose que tous les programmes susceptibles d'insérer des lignes dans "B" respectent ce principe de fonctionnement.
Ce n'est sans doute pas l'idéal, mais c'est une piste.
-
j'y avais effectivement pensé avec une table paramètres.
Dans mon cas, une suppression de scéance n'est pas envisagée et seul un utilisateur met à jour la base.
ça simplifie les accès concurrents, mais j'aimerais effectivement une solution propre !
merci
-
Une idée en l'air ...
Vu que ça semble juste pour l'affichage, vous pourriez utiliser une sequence dans une colonne id. Et ensuite, faire une vue là-dessus, avec une colonne id_affichage dans lequel vous faites un rank() over (order by id)
-
Super cette solution, testée, adoptée, c'est la plus simple à mon sens. Je garde la séquence....
J'avais vu la fonction rank, mais je ne l'avais jamais utilisée
Merci pour tous ces bons conseils.
Bonne journée