Réorganiser les ID dans ma base de données. C# SQL [Résolu]

Signaler
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
-
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
-
Yop yop yop,

J'aimerais savoir s'il y a un moyen très simple de réorganiser les ID dans ma base de donnée SQL, parce que qu'en je supprime une ligne de données les ID vaux 1,2,3,5,6,7 ce qui fait bien évidement tout planter quand mon programme cherche à récupérer une donnée à l'ID 4, j'aimerais qu'il redevienne organisé : 1,2,3,4,5,6. (ne me dites pas qu'il ne faut pas faire ça sinon j'vous bute)

Je vous pose la question histoire d'éviter de devoir faire pas mal de ligne de code en le faisant "mannuellement" avec des boucles et des conneries. Merci aled.

7 réponses

Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Ben non, il ne faut pas.

Supposons que tu aies besoin de synchroniser un téléphone qui n'est pas toujours en ligne avec une base de données en ligne.

Si sur la bdd, tu supprimes l'item 4 et que tu réorganises le reste, lors de la synchro, le téléphone vera que le dernier index (disons 34 ) n'existe plus et supprimera cet index.
Tu vas te retrouver avec 2 bdd différentes et impossible à gérer.

Enfin, si tu as supprimé, l'ID 4 et qu'après tu cherches cet ID c'est que quelque part tu as mal géré un truc.
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Oui, je sais tout ça, j'ai vu d'autres posts à ce sujet d'où le "(ne me dites pas qu'il ne faut pas faire ça sinon j'vous bute)". (du coup RIP toi)
Mais, c'est parce que j'utilise l'ID comme un "compteur" : ID = le X ième machin. Et pas vraiment comme un ID. Et donc arrivé au 4 ième machin bah il me dit "What the fuck, le 4 ième n'existe pas, c'est non". Du coup y a moyen ou pas ?
Messages postés
14673
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2020
234
En général, les SGBDR incluent déjà un moyen de le faire :
MySql :
SELECT * FROM MaTable ORDER BY Champ ASC LIMIT 5,2

Cela extrait les lignes 6 et 7 (offset 5 base 0 nombre 2) de la table selon l'ordre de tri sur Champ en ascendant.
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14 >
Messages postés
14673
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2020

Euuuh, rien compris.
Messages postés
36
Date d'inscription
mercredi 12 février 2020
Statut
Membre
Dernière intervention
2 juillet 2020
4
Oui, en effet, il faut compter les lignes.

SqlConnection conn = new SqlConnection("ConnectionString");
conn.Open();
SqlCommand comm = new SqlCommand("SELECT COUNT(*) FROM table_name", conn);
Int32 TotalRows = (Int32) comm .ExecuteScalar();
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
J'veux pas compter les lignes je veux transformer ID 1,2,3,5,6,7 en ID 1,2,3,4,5,6 en une seule commande.
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
@Cédric, merci pour tes prochains posts de lire (et appliquer) ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

@Pearusdoancaia
Tu n'es pas très explicite, ce qui explique que des réponses ne correspondent pas à ce que tu voudrais faire.
Ce dont je suis sûr, c'est que tu veux te servir de l'ID pour ce qu'il n'est pas. Un peu comme se servir d'un vélo comme un échelle, ça pourrait marcher mais c'est casse gueule....

Ce que je crois avoir compris, tu as des données dans ta bdd (des gens par exemple)
Nom     Prénom      ID
Jean     Sors          1
Mélanie  Zetofrais     2
Alain     Di          3
Marie     onette      5


Et avoir une requête qui t'extrait le 4 eme enregistrement?
Si c'est bien ça, ce n'est ni un ID ni un compteur. Pour une collection, je t'aurais dit c'est un index, mais en sql (les bdd c'est pas mom fort), je ne sais pas si index n'a pas une autre signification.

Pourrais tu poster le coder que tu utilises actuellement pour voir comment l'adapter?



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Alors, je vais être plus précise :

Tout d'abord j'ai une méthode qui retourne le dernier ID de ma base de données (je crois) grâce à "SELECT Max(ID) FROM MaTable".

Je récupère la valeur dans lastMonTrucID qui vaux 7 admettons, que j'utilise dans une boucle :

                do
                {
                    NID++;
                    MonUserControl newMonTruc = new MonUserControl(mainFormLoadORNot, NID);
                    //etc...

                } while (NID != LastMonTrucID);


"mainFormLoadORNot" c'est pour savoir si je modifie ce qu'il y a dans mon UserControl ou si je le charge quand je lance l'appli' ou si j'en créer un nouveau (Clique droit créer un nouveau MonTruc)
NID vaux 1 jusqu'à lastMonTruckID (7 donc), et j'utilise NID pour le chargement des UserControl, exemple :

NID = 1, je récupère la donnée NOM, de l'ID qui est égal à NID(1), qui est Michmich, je modifie le texte de la texteBox par MichMich
je récupère la donnée PRENOM, de l'ID qui est égal à NID(1,) qui est TutoRaclette, je modifie le texte de la texteBox par TutoRaclette
etc.. etc.. Pour tous les éléments de mon UserControl de l'ID 1

NID = 2, idem mais pour l'ID qui est égal à 2.

etc... etc...

Tout charge bien.

Mais tu vois, s'il y a un trous, si NID vaux 4 et qu'il n'y a pas d'ID qui vaux 4 parce que je l'ai supprimé et bah il y a une erreur qui dit qu'il n'existe pas, normal.

Mais en aucun cas je l'utilise autrement, et j'y compte pas. On pourrait remplacer "ID" par "Emplacement dans ma base de donnée" et c'est comme ça que je veux l'utiliser.

Donc, je peux faire : clique droit supprimer MonTruc, ce qui décharge l'UserControl qui a le focus et supprime sa ligne dans la base de données. Si ce MonTruc avait comme ID 4, dans ma base de données ça va donner :

ID NOM PRENOM
1 gfdgykl rykryukryuky
2 yrukryu ergerger
3 ergerger ergerger
5 eeeeee rrrrrrrrrrrrr
6 Youplet Deneslet
7 Nik Tasalut

Et moi je veux que ça fasse :

ID NOM PRENOM
1 gfdgykl rykryukryuky
2 yrukryu ergerger
3 ergerger ergerger
4 eeeeee rrrrrrrrrrrrr
5 Youplet Deneslet
6 Nik Tasalut

Donc, j'aimerais savoir si c'est possible, grâce à une simple commande, de réorganiser les ID en 1,2,3,4,5,6 pour éviter de devoir le faire "manuellement" avec des boucles et donc, devoir rajouter pas mal de lignes. Je sais pas si c'est plus claire. ?_?
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonjour
Mais en aucun cas je l'utilise autrement, et j'y compte pas. On pourrait remplacer "ID" par "Emplacement dans ma base de donnée" et c'est comme ça que je veux l'utiliser.


Toi non, mais ta base de données t’en sais rien.

Tu peux faire ça avec un champ entier que t’appelle comme tu veux, mais pas ID.

Mais quoiqu’il en soit, ça n’est pas une bonne solution.
Supposons que tu aies 1000 item, si tu supprimes le 4 eme, il faut en mettre à jour 996.

Puisqu’apparemment tu charges tous les items, tu n’as pas besoin de savoir en avance combien y’en a.

Tu peux, par exemple, tout mettre dans un datatable et ensuite l’itérer du debut à la fin
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Bon. Supposons que je fasse exactement la même chose mais pas sur ID, comment je fais ?
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Tu les itères un par un pour les modifier
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Ouais, ça je sais, mais avec une commande SQL, ça n'existe pas ? Une commande qui permet de faire ça en quelque ligne c'est plié ? (c'est ma question de base hein, au cas où...)
Messages postés
14673
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2020
234 >
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020

Non, pas de commandes pour faire cela.

Dans ton cas, tu peux avoir 2 variables un compteur et un ID par exemple en métacode :
var MaListe=ResultatSQL ("SELECT Id FROM ... ORDER BY Id ASC")

var lIndex=0;
while(FinPasAtteinte)
{
    lIndex++;//Part à 1 donc
    MonUserControl newMonTruc = new MonUserControl(mainFormLoadORNot, lIndex, MaListe.CurrentItem["Id"]);
    //etc...
    
    //PasserAEnregistrementSuivant
}


et @Whismeril Oui, en BDD un Index a un autre sens, c'est une sorte de mise en cache de données pour les retrouver plus vite.
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553 >
Messages postés
14673
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2020

Salut
et @Whismeril Oui, en BDD un Index a un autre sens, c'est une sorte de mise en cache de données pour les retrouver plus vite.

il me semblait, mais je ne voulais pas dire de bêtises....
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Bon, bah, vu qu'on me dit que ça n'existe pas et que j'ai pas trouvé et bah je l'ai fait "manuellement", finalement il n'y avait pas tant de ligne de code que ça. ça fonctionne très bien. Merci quand même.