IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Séquence sans trou


Sujet :

SQL Oracle

  1. #1
    r83
    r83 est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Par défaut 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

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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 ?

  3. #3
    r83
    r83 est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Par défaut
    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.

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    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.

  5. #5
    r83
    r83 est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Par défaut
    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

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut 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)

  7. #7
    r83
    r83 est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quadrillage aléatoire sans trou
    Par Yamuto dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 12/09/2013, 14h34
  2. numérotation enregistrements sans trou
    Par lemask dans le forum VBA Access
    Réponses: 4
    Dernier message: 26/05/2009, 11h56
  3. [Oracle 10g]Trou dans les séquences des redo logs
    Par Christophe P. dans le forum Administration
    Réponses: 11
    Dernier message: 07/11/2008, 20h13
  4. [9i] séquence sans trou
    Par sygale dans le forum Oracle
    Réponses: 2
    Dernier message: 11/04/2007, 13h25
  5. [débutant] "auto_increment" sans trou ?
    Par Mathusalem dans le forum Oracle
    Réponses: 6
    Dernier message: 24/04/2006, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo