Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2011, 14h00   #1
Invité régulier
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 9
Points : 9
Par défaut decrementation de l'id dans une BD

Salut à tous,

Je travaille sous vista avec eclipse BD : MySQL.

Ma question est :
j'ai mis la colonne des Primary key (id) AUTO_INCREMENT, et j'ai 4 autres colonnes.
- disons que j'ai : n (rows) lignes
- je supprime la ligne avec l'id : "n-3"... cela s'effectue sans problème.
- mais sur le nouveau tableau j'ai cela:
id : n-5
id: n-4
id: n-2 *********
id: n-1
id: n
- je veux rendre le (id: n-2) en (id: n-3) et ainsi de suite ==> (id: n-1) en (id: n-2)...
sans pour autant affecter les autres colonnes de la ligne
- c'est-à-dire décrémenter toutes les lignes se trouvant après la ligne supprimée, comme je travaille avec java.

j'ai essayé avec cette méthode
-
Code :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    //methode delButton
   private void delButtonActionPerformed(ActionEvent evt) {
 
        int SELECT = stockTable.getSelectedRow() + 1;
 
       String sql="";
       String sql2 = "";
 
        try{
 
            sql=" DELETE FROM tab_bas " +
                   "WHERE id = " + 'select';
            stmt.executeUpdate(sql);
 
            sql2 = "SELECT id FROM tab_bas";
            ResultSet rs = stmt.executeQuery(sql2);
 
            int cmp1 = 0;
            int cmp2 = 1;
            int selCmp1 = 0;
            int selCmp2 = 0;       	    
 
            while(rs.next())
             {
            	selCmp1 = select2  + cmp1 ;
            	selCmp2 = select2 + cmp2;
 
 
           	 stmt.addBatch("UPDATE tab_bas SET "
           		 + "id = "+ 'selCmp1' + "WHERE id = "+'selCmp2');
 
           	 cmp1++;
           	 cmp2++;
             }
           int[] nb = stmt.executeBatch();
           //
 
           //initComponents();
 
        }
        catch(Exception e){
            commentLabel.setText("Error occurred in inserting data");
            e.printStackTrace();
        }
 
    }
Malheureusement, le résultat n'est toujours pas probant

Merci d'avance
tifozy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 16h49   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Pourquoi vouloir modifier des id auto_incrémentés ?
S'ils sont clés étrangères dans d'autres tables, en plus, c'est dangereux.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 17h18   #3
Invité régulier
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 9
Points : 9
Parce que j'ai créé un JTable et qu'en supprimant la ligne sur le JTable, je veux que la ligne correspondante sur la base de données soit supprimée.

pour choisir la ligne au niveau de JTable, j'ai:

Code java :
 int select = stockTable.getSelectedRow() + 1;

Ce select sera la ligne à supprimer au niveau du tableau BD

Code java :
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
32
33
34
35
36
 try{
 
            sql=" DELETE FROM tab_bas " +
                   "WHERE id = " + 'select'; //le select est pris depuis le jtable
            stmt.executeUpdate(sql);
 
            sql2 = "SELECT id FROM tab_bas";
            ResultSet rs = stmt.executeQuery(sql2);
 
            int cmp1 = 0;
            int cmp2 = 1;
            int selCmp1 = 0;
            int selCmp2 = 0;       	    
 
            while(rs.next())
             {
            	selCmp1 = select2  + cmp1 ;
            	selCmp2 = select2 + cmp2;
 
 
           	 stmt.addBatch("UPDATE tab_bas SET "
           		 + "id = "+ 'selCmp1' + "WHERE id = "+'selCmp2');
 
           	 cmp1++;
           	 cmp2++;
             }
           int[] nb = stmt.executeBatch();
           //
 
           //initComponents();
 
        }
        catch(Exception e){
            commentLabel.setText("Error occurred in inserting data");
            e.printStackTrace();
        }

cela s'effectue ... la première fois sans problème
mais pour une deuxième suppression, j'ai deux cas :
1. si l'id de la ligne choisie est inférieur à l'id de la ligne déjà supprimée,
cela ne pose pas de problème...elle sera effectivement supprimée.

2. si l'id de la ligne choisie est supérieur à l'id de la ligne déjà supprimée,
cela pose grand problème...une autre ligne sera supprimée

le problème est qu'en supprimant sur le JTable, l'index se met à jour tout seul,
mais sur la base de donnée non...


Bon, maintenant, je travaille sur une correspondance autre que celle id/index,
mais j'accepterai toujours des propositions ou des orientations.

merci bien
tifozy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 18h48   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par tifozy Voir le message
parceque j'ai crée un JTable et qu'en supprimant la ligne sur le JTable je veut que la ligne correspandante sur la base de donnée soit supprimée.
Que je sache, après la requête DELETE, la ligne va bien être supprimée, je ne vois pas l'intérêt de modifier les id.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 19h45   #5
Invité régulier
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 9
Points : 9
oui t'a raison !
ce n'est qu'une fuite de ma part
mille excuses...je vais modifier mon texte
tifozy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 19h49   #6
Invité régulier
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 9
Points : 9
Non , non c'est correct. C'est juste qu'il faut suivre ce que j'ai écrit par la suite (dans le même paragraphe).

Cela ne s'effectue correctement qu'à la 1ere suppression, puis la ligne que je supprime au niveau du jtable n'est pas la même au niveau de la base de données.

merci
tifozy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 21h52   #7
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Mais quel intérêt de vouloir, à tout crin, conserver la séquentialité des ids ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 22h36   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Je ne peux qu'appuyer Maljuna Kris, il ne faut pas mettre à jour l'id (qui est à priori la PK) car cet id est peut être déjà utilisé dans des tables liées ou alors il le sera probablement dans l'avenir.
Citation:
bon maintenant je travail sur une correspandance autre que celle id/index
Oui c'est nécessaire, crée une colonne ordre puis met la à jour avec les valeurs actuelles de l'id :
Code :
UPDATE tab_bas SET ordre = id
Ajuste manuellement si nécessaire, ensuite plutôt qu'executer le code suivant:
Code :
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
sql2 = "SELECT id FROM tab_bas";
            ResultSet rs = stmt.executeQuery(sql2);
 
            int cmp1 = 0;
            int cmp2 = 1;
            int selCmp1 = 0;
            int selCmp2 = 0;
 
sql2 = "SELECT id FROM tab_bas";
            ResultSet rs = stmt.executeQuery(sql2);
 
            int cmp1 = 0;
            int cmp2 = 1;
            int selCmp1 = 0;
            int selCmp2 = 0;       	    
 
            while(rs.next())
             {
            	selCmp1 = select2  + cmp1 ;
            	selCmp2 = select2 + cmp2;
 
 
           	 stmt.addBatch("UPDATE tab_bas SET "
           		 + "id = "+ 'selCmp1' + "WHERE id = "+'selCmp2');
 
           	 cmp1++;
           	 cmp2++;
             }
           int[] nb = stmt.executeBatch();
           //
tu peux après le delete faire :
Code :
UPDATE tab_bas SET ordre = ordre - 1 WHERE ordre >= ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/06/2011, 09h54   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
D'autant que, si tu veux vraiment avoir un classement par ordre d'insertion:
Code :
1
2
3
4
5
6
SELECT COUNT(*) AS rang, tb1.id
FROM tab_bas AS tb1
INNER JOIN tab_bas AS tb2
    ON tb2.id<= tb1.id
GROUP BY tb1.id
ORDER BY rang
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/06/2011, 12h36   #10
Invité régulier
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 9
Points : 9
merci les amis c'est ce que je viens de faire

ça marche impecablement ...vous m'e'tiez d'un trés grand secour..

merci et à plus
tifozy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h12.


 
 
 
 
Partenaires

Hébergement Web