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

JDBC Java Discussion :

[JDBC]problème avec mes id


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    février 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 116
    Points : 44
    Points
    44
    Par défaut [JDBC]problème avec mes id
    mes clés primaires sont en auto-incréments. Par exemple j'ai 3 enregistrements. ca donne 1,2,3 mais si j'efface le 3eme et que j'en crée un nouveau, il aura l'id 4 alors qu'il devrait avoir le 3... comment régler ce problème ?

    [ Modéré par SEMPERE Benjamin ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    décembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2002
    Messages : 144
    Points : 197
    Points
    197
    Par défaut
    Mettre du code c'est plus simple pour les réponses

  3. #3
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    1- Quel est le rapport avec Java ?

    2-
    mais si j'efface le 3eme et que j'en crée un nouveau, il aura l'id 4 alors qu'il devrait avoir le 3
    Qui a dit que ce devait être 3 ?

    3- Si tu veux un comportement "sur-mesure", alors tu n'as qu'une solution : programme-le ! (c'st valable pour tous les langages).

  4. #4
    Membre du Club
    Inscrit en
    février 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 116
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Jfrancois57
    Mettre du code c'est plus simple pour les réponses
    voila un insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
      public int insertLieu(Lieu l) {
        int idxRet = -1;
        String sql = "INSERT INTO t_lieu (l_npa, l_ville) " +
            "VALUES ('" + l.getL_npa() + "', '" + l.getL_ville() +"')";
        int nbrRec = dbc.executeSQL(sql);
        if (nbrRec == 1) {
          // recherche de l'index
          String rsql = "SELECT l_id FROM t_lieu WHERE l_ville = '" + l.getL_ville() +
              "' AND l_npa = '" + l.getL_npa() + "'";
          ResultSet rs = dbc.createResultSet(rsql);
          try {
            if (rs != null) {
              rs.next();
              idxRet = rs.getInt(1);
            }
          }
          catch (SQLException se) {
            dbc.showListSqlExceptions(se);
          }
          try {
            if (rs != null) {
              rs.close();
            }
          }
          catch (SQLException se) {
            dbc.showListSqlExceptions(se);
          }
        }
     
        return idxRet;
      }

  5. #5
    Membre du Club
    Inscrit en
    février 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 116
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par NGY
    1- Quel est le rapport avec Java ?

    2-
    mais si j'efface le 3eme et que j'en crée un nouveau, il aura l'id 4 alors qu'il devrait avoir le 3
    Qui a dit que ce devait être 3 ?

    3- Si tu veux un comportement "sur-mesure", alors tu n'as qu'une solution : programme-le ! (c'st valable pour tous les langages).
    ben se serait mieux que se soit 3, sinon au bout d'un moment ca fera de très gros id

  6. #6
    Membre averti
    Inscrit en
    août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par Hydre
    ben se serait mieux que se soit 3, sinon au bout d'un moment ca fera de très gros id
    Et que fais tu de l'unicité de ton identifiant qui doit te servir à identifier un enregistrement unique.
    Exemple 1 :
    - l'utilisateur 1 enregistre 1 ligne dans ta table et récupere l'id 3
    - l'utilisateur 1 enregistre 1 ligne dans ta table et récupere l'id 4
    - l'utilisateur 2 supprime l'enregistrement avec l'id 4
    - l'utilisateur 2 enregistre 1 nouvelle ligne et récupère l'id 4
    - l'utilisateur 1 fait une recherche sur l'id 4 et ne comprend pas pourquoi il ne reconnait pas son enregistrement...la clé primaire ne remplit pas son role : identifier un enregistrement unique.

    Exemple 2 :
    - tu enregistres 1 ligne dans ta table, tu récuperes l'id 3
    - tu enregistres 1 ligne dans ta table, tu récuperes l'id 4
    - tu supprimes l'enregistrement avec l'id 3
    - tu enregistres 1 nouvelle ligne...qu'est ce que tu attends ? 3 ou 5 ?

    Tout ca pour dire que ce que tu cites comme étant un problème n'en est pas un en réalité. Et l'approche est la même dans les différentes bases (champs avec auto-incrémentation, séquences, pseudo-séquences...)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Sinon, si c'est vraiment ce que tu veux faire...plutôt que d'utiliser un auto-increment, tu lance une petite requete genre : select MAX (id) from ma_table
    Un fois ton résultat récupéré, ben t'ajoute 1...
    Par contre, question perf c'est pas le top...
    La naissance est le seul fruit du hasard

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : mars 2002
    Messages : 652
    Points : 1 131
    Points
    1 131
    Par défaut
    Citation Envoyé par tomca
    Sinon, si c'est vraiment ce que tu veux faire...plutôt que d'utiliser un auto-increment, tu lance une petite requete genre : select MAX (id) from ma_table
    Un fois ton résultat récupéré, ben t'ajoute 1...
    Par contre, question perf c'est pas le top...
    SURTOUT PAS
    Ne jamais faire ceci
    Les commits des transactions en cours vont te générer des doublons sinon

    exemple: 2 enregistrements ds la base respectivement PK 1 et 2.
    Un utilisateur ajoute un 3 ème enregistrement et un second utilisateur en fais de même, il récupère aussi une PK à 3 tant que le premier utilisateur n'as pas commité son insert !
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Effectivement...
    Enfin, moi je me sert de ca pour faire du traitement de donnée, et je suis certain d'être le seul a bosser sur la table...donc ca fonctionne...
    Mais tu as raison, j'avais pas pensé au multi-utilisateur...
    La naissance est le seul fruit du hasard

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    novembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2002
    Messages : 154
    Points : 143
    Points
    143
    Par défaut
    Salut,

    Ca pourrait marcher si une seule méthode s'occupe de récupérer le max et d'enregistrer et que cette méthode est synchronized?
    Bonne chance, Bonne journée, bonne année bonne santée et etc ...
    Youpi la vie est belle ! Et vive la fraicheur

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : mars 2002
    Messages : 652
    Points : 1 131
    Points
    1 131
    Par défaut
    non, le problème de viens pas de ton process java mais de la base de données !
    En gros, il te faut écrire une procédure stockée synchronized et ça, je sais même pas si c'est du domaine du faisable
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  12. #12
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Oui, c'est un problème de BD uniquement, de conception plus précisémentUn "bon" identifiant ne doit pas servir à autre chose que d'identifier de façon unique une ligne dans la table.
    En voulant absolument "boucher" les trous dans la séquence, on donne un nouveau rôle à l'identifiant.
    Un numéro de séquence ne fait qu'augmenter et une suppression dans la table générera forcément un "trou" ... et alors ?!

    Si tu veux conserver un numéro d'ordre dans les lignes de la tables, il faut ajouter une colonne et la gérer toi-même.

  13. #13
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    J'ai fait le même constat récemment, mais ça ne vient pas du code, ça vient simplement du système de gestion de base de données.

    Pour voir quand la base explosera j'ai fait un petit calcul :

    - estimation du nombre d'enregistrement que j'ai par an (100 par jour * 365)
    - maximum de l'identifiant, c'est un int, 2 147 483 647.

    Ensuite une petite division 2 147 483 647 / (100*365), et voila, ma base explosera dans environ 58 000 ans , amuse toi à faire pareil et ça m'étonnerait que tu arrives à la limite avant quelques années

Discussions similaires

  1. [JDBC]Problème avec PreparedStatement
    Par tomca dans le forum JDBC
    Réponses: 15
    Dernier message: 08/07/2005, 14h59
  2. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 12h56
  3. Réponses: 5
    Dernier message: 19/08/2004, 12h11
  4. [JDBC] Problème avec les accents
    Par seawolfm dans le forum Administration
    Réponses: 2
    Dernier message: 29/01/2004, 15h56
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 16h16

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