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 :

Questions sur les séquences


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut Questions sur les séquences
    Bonjour,
    je stocke dans une table une liste d'entités déterminées qui peuvent être au maximum de 99 tout en ayant un identifiant allant de 1 à 99.
    J'ai donc naturellement créé une séquence allant de 1 à 99 pour pouvoir gérer une surrogate key les identifiants....
    Mon application permet ensuite de supprimer une de ces entités si elle n'est plus utilisée. Du coup je me retrouve avec des trous dans la séquence que j'aurais souhaité pouvoir réutiliser...
    J'aurais voulu savoir quelle était la meilleure façon de s'y prendre... Car la seule manière que je vois c'est de modifier tous mes ordres d'insertion pour qu'ils cherchent en priorité le premier gap dans la séquence avant d'insérer..
    Pour une requête en one-shot pourquoi pas : mais pour un traitement par batch?

    Merci pour vos avis sur la question,
    Lek

  2. #2
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Bonjour,


    Actuellement comment vous faites exactement la mise à jour de votre table? C'est à dire par exemple à partir d'un fichier de données avec SQL*Loader ou un fichier script avec des INSERT?

    Ainsi, comment vous faites actuellement la mise à jour de la clé associée à chaque item? Manuellement avec un UPDATE?


    Cordialement,

  3. #3
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Bonsoir,
    actuellement j'ai une appli web qui permet de faire des insertions dynamiques via des procs avec des requêtes du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO ma_table
    (table_id, label)
    VALUES
    (seq_table_id.NEXTVAL, 'Un libelle');
     
    update ma_table set label = 'nouveal label' where table_id=pTableId;
    A l'installation de l'appli (et parfois en cours de vie de l'application dans ce cas j'utilise des merge) il peut y avoir des imports via des tables externes, j'ai alors une requête du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into ma_table
    (table_id, label)
    select seq_table_id.NEXTVAL, tmp_lib from table_externe ;

  4. #4
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Par défaut
    Bonjour,

    Une séquence n'est pas faite pour ça
    Un identifiant est une donnée purement technique, peu importe qu'il y ait des trous et il ne faut pas chercher à avoir des numéros précis. Par ailleurs, réutiliser des ID peut causer des problèmes s'ils sont utilisés ailleurs comme référence.

    Si les numéros de 1 à 99 ont une signification fonctionnelle, il faut utiliser autre chose qu'une séquence pour les gérer et les utiliser comme clé secondaire en gardant un ID technique. Si ce n'est pas la cas, gardez uniquement votre ID technique.

  5. #5
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    ... Si les numéros de 1 à 99 ont une signification fonctionnelle, il faut utiliser autre chose qu'une séquence pour les gérer et les utiliser comme clé secondaire en gardant un ID technique ...
    Très bonne remarque, justement comme un ensemble relationel les éléments ne sont pas ordonnés dans une table oracle. En plus dans le cas d'un accès concurrent et le problématique de synchronisation je me demande s'il pourra garantir la contiguïté des valeurs associées.

    A la limite, moi ce que je ferrais c'est créer une vue objet (ou même une vue ordinaire) sur la table ensuite un trigger BEFORE INSERT UPDATE sur cette vue, puis je pointe l'appli sur cette vue au lieu de tapper directement la table (sinon on aura le problème classique de ORA-04091: table XXXX is mutating).

    Ensuite à l'intérieur de ce trigger je declare un Nested Table dont le type aurait été déjà déclaré au niveau de schéma, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL> CREATE TYPE tab_ty IS TABLE OF votretable%ROWTYPE;
    Et c'est à l'intérieur de ce trigger où je récupère la totalité du contenu de la table en question. Etant donné qu'il n'y a que 99 éléments l'impact d'un point de vue de la performance ne sera pas si important que ça (mais bon après il faut quand même prendre en comtpe la fréquence d'accès sur la table).

    Bref, à l'intérieur d'une LOOP je peux parcourir la table, faire les mise à jour requises, voir trier les éléments si besoin et générer à nouveau un ID itérative (qui peut très bien être simplement le compteur de mon boucle éventuellement concatené avec un prefix pour lui donner une apparence de clé). Finalement vous faite une mise jour de la table principale à partir de l'objet de collection (Nested table)


    Cordialement,

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    L'ERP sur lequel je travaille utilise pour ça deux tables, donc voici la structure simplifiée :

    Une table "compteur" :
    id_compteur
    min
    max
    increment
    valeur

    Une table "trou" :
    id_trou
    id_compteur (fk vers compteur.id_compteur)
    valeur

    Lors de la suppression d'une ligne, on ajoute une ligne dans "trou" avec la valeur supprimée, pour le bon code compteur (numéro de commande, facture, etc.)
    Lors de l'insertion d'une ligne, on interroge en premier la table compteur, pour retrouver le min/max pour le compteur.
    On vérifie alors si dans la table "trou" on trouve une valeur comprise entre min et max pour le compteur. Si c'est le cas, on prends cette valeur, et on supprime la ligne dans trou. Sinon, on incrémente (selon l'incrément, et tant que ça reste en dessous du max) la valeur de la ligne de compteur, et on utilise cette valeur pour l'insertion.

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

Discussions similaires

  1. [ATL] Question sur les séquences
    Par HGdams dans le forum Eclipse
    Réponses: 1
    Dernier message: 01/04/2011, 09h33
  2. Question sur les diagrammes de séquences
    Par Kais94 dans le forum BOUML
    Réponses: 7
    Dernier message: 16/08/2008, 21h54
  3. [Oracle 8i & 10g] Une question sur les séquences
    Par Bahan dans le forum Administration
    Réponses: 5
    Dernier message: 06/04/2007, 14h54
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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