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

Résolu/Fermé
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 - Modifié le 12 févr. 2020 à 17:41
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 - 15 févr. 2020 à 15:03
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

Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
12 févr. 2020 à 17:09
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.
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
12 févr. 2020 à 17:27
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 ?
0
NHenry Messages postés 15156 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 septembre 2024 335
12 févr. 2020 à 18:47
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.
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86 > NHenry Messages postés 15156 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 septembre 2024
12 févr. 2020 à 19:38
Euuuh, rien compris.
0
Cedric69004 Messages postés 36 Date d'inscription mercredi 12 février 2020 Statut Membre Dernière intervention 2 juillet 2020 7
Modifié le 13 févr. 2020 à 13:23
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();
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
12 févr. 2020 à 19:41
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.
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
Modifié le 12 févr. 2020 à 20:58
@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?



0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
Modifié le 12 févr. 2020 à 22:57
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. ?_?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
13 févr. 2020 à 13:11
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
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
13 févr. 2020 à 15:37
Bon. Supposons que je fasse exactement la même chose mais pas sur ID, comment je fais ?
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
13 févr. 2020 à 18:03
Tu les itères un par un pour les modifier
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
13 févr. 2020 à 18:21
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ù...)
0
NHenry Messages postés 15156 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 septembre 2024 335 > Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021
Modifié le 13 févr. 2020 à 19:02
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.
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919 > NHenry Messages postés 15156 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 septembre 2024
13 févr. 2020 à 21:32
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....
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
15 févr. 2020 à 15:03
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.
0