Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connaitre le numéro de clé primaire non utilisé?

Existe il une instruction pour parcourir les clés primaire

Sujet résolu
    21 février 2023 à 9:48:26

    Bonjour, j'ai besoin de parcourir le champ de mes clés primaire de ma table afin de savoir si certaines sont vides et quelle est la dernière utilisé.

    Voici j'ai une table très simple :

    ID int(10) et nom varchar (100)

    ID étant bien entendu la clé primaire

    Le numéro d'ID et le nom forment un couple du genre

    ID    nom

    1     Ruche 1

    2     Ruche 2

    3     Ruche 3

    ...

    Jusqu'à présent j'ai rentré manuellement mes données dans cette table , mais je suis en train d'essayer de faire un formulaire PHP pour permettre le remplissage de cette table .

    Je me suis aperçu d'un petit soucis, tout va bien si je n'efface jamais une entrée dans ma table, mais si j'efface une entrée le numéro d'ID associé dans la table est "perdu" je ne peux plus le réaffecter:

    exemple (surement plus parlant) j'efface dans ma table l'entrée ID = 2 , si plus tard je veux recréer la Ruche 2 elle n'aura plus l'ID 2 mais le suivant dans ma table, chose que je ne veux pas!

    Je veux garder le couple ID 2 => Ruche 2.

    Mais il me faut 2 choses :

    détecter les "trous dans la suite des ID pour proposer la recréation de la ruche 2

    et trouver le dernier ID de la table pour proposer l'ajout d'une toute nouvelle Ruche avec son ID associé!


    D'où mon post pour savoir s'il existe une instruction (ou un code déjà établi) sur MariaDb pour le faire (au moins ceci détecter le manque d'ID)

    J'espère avoir été clair.

    Merci

    -
    Edité par GillesMangin-Voirin 21 février 2023 à 9:53:57

    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2023 à 14:18:28

      Si je comprend bien ton id est en autoincrement, mais si  l'id est lle numero de la ruche tu peux le fixer toi meme.

      Rien ne t'empeche de réinsérer un id que tu as supprimé

      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2023 à 18:19:52

        Oui je peux refixer un ancien ID ou même un nouveau, là mon soucis c'est la détection des "ID vierges"

        Par exemple j'ai dans ma table ceci :

        ID       nom

        1        Ruche 1

        2       Ruche 2

        5       Ruche 5

        7     Ruche 7

        mon interrogation c'est comment en parcourant la table (colonne ID donc clé primaire) détecter que je peux proposer 

        l'ID 3 pour la Ruche 3,

        l'ID 4 pour la Ruche 4,

        l'ID 6 pour la Ruche 6 et

        l'ID 8 et les suivants

        La question était existe t-il une instruction, un code ou autre qui permette d'obtenir simplement dans la liste des clé primaire celles qui manquent.

        Merci

        Bon en attendant de savoir s'il y a une instruction pouvant faire ce que je souhaite j'ai fais ceci en php:

        // Liste de toutes les ruches
        $requete = $bdd->query('
        			SELECT id_ruche, nom
        			FROM Liste_ruches
        			ORDER BY id_ruche;'
        			);
        			
        $ruches = $requete->fetchAll();
        $nbRuche = count($ruches);
        
        // initialisation vide du tableau de liste des ID
        for ($c=1; $c <=(($ruches[$nbRuche-1]['id_ruche'])+1); $c++) {
        	$listeId[$c] = 0;
        }
        
        
        foreach( $ruches as $ruche ) {
        	$listeId[$ruche['id_ruche']] = $ruche['id_ruche'];
        																														                                      
        }
        																		
        for ($b=1; $b <= ($ruche['id_ruche']); $b++) {
        	if ($b != $listeId[$b]) $listeLibre[$b] = $b;
        											
        }
        									
        // ici pour permettre l'ajout d'une ruche suivant la dernière dans la table									
        $listeLibre[$b] = ($ruche['id_ruche']+1);
        
        // contrôle visuel									
        echo "<br> liste ID libre ; <br>";
        var_dump($listeLibre);
        
        

        Si quelqu'un a plus léger, ou mieux ...
        J'ai testé avec ceci :

        cela semble bien fonctionner... J'obtiens bien les trous à savoir ici 6,8,9 et le 11 puisque 10 est la fin de la table

        Merci

        -
        Edité par GillesMangin-Voirin 21 février 2023 à 19:20:06

        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2023 à 19:24:02

          Bonjour, pour connaitre le dernier ID d'une table LAST_INSERT_ID()

          Tu as l'équivalent en PHP (PDO) https://www.php.net/manual/fr/pdo.lastinsertid.php

          Je ne comprends pas la problématique que tu rencontre si une entrée en DB est supprimée. Normalement il ne devrait pas y avoir de problème, c'est le but et le rôle du SGBD que de s'y retrouvé si une ou plusieurs entrées sont supprimées. Ton application ne devrais pas dépendre du numéro d'id dans une table. Si une entée est supprimée, l'ID de cet entrée n'est pas à réutilisé. Tu crée une nouvelle entée et un nouveau ID sera crée.

          Si par contre la problématique est d'avoir une correspondance entre un numéro de ruche et son nom, je te recommanderais d'avoir un champs supplémentaire ruche_number pour y stocker le numéro de la ruche.

          thetui a écrit:

          Rien ne t'empeche de réinsérer un id que tu as supprimé

          Je n'ai pas fait de test mais je ne pense pas que l'on puisse récréer une entre en spécifiant l'ID de cette entrée si cela est en AUTO_INCREMENT.



          -
          Edité par AbcAbc6 21 février 2023 à 19:25:38

          • Partager sur Facebook
          • Partager sur Twitter
            21 février 2023 à 20:19:38

            Alors pour répondre à la question sur la réutilisation de l'ID cela ne pose pas de soucis même avec une clé primaire en auto-incrémente (j'ai testé cela fonctionne bien)

            Pour la réutilisation de l'ID, c'est bien ce que je veux faire car j'ai développé tout mon logiciel sur cette base id_ruche = id clé primaire.

            Il est vrai que je n'avais pas pensé à la suppression d'une ruche (mort de la colonie, puis remise en place l'année suivante d'un nouvel essaim dans cette même ruche...)

            Trouver la dernière entrée c'est la chose la plus simple, mais je vais regarder quand même cette fonction qui dois le faire mieux que moi...

            Je recherchais plus une fonction qui permettrais de connaitre les clé primaire vides plus simplement que ce que j'ai fais si dessus.

            De plus il faut encore maintenant que je transpose le résultat de mon tableau $listeLibre qui contient dans mon exemple :

            array(4) { [6]=> int(6) [8]=> int(8) [9]=> int(9) [11]=> int(11) }

            dans un autre tableau (à moins de pouvoir réorganiser celui-ci) sous une forme du genre :

            array(4) { [0]=> int(6) [1]=> int(8) [2]=> int(9) [3]=> int(11) }

            afin de pouvoir le parcourir pour l'afficher..

            Merci

            • Partager sur Facebook
            • Partager sur Twitter
              21 février 2023 à 20:46:18

              Bonsoir, Bien, dans ce projet la BDD n'a pas été pensée au départ, et tu procède souvent (au vu des différents sujet que tu postes) à une emplâtre.

                Tu souhaites garder le code que tu as écrit pour ne pas le réécrire, ce que je peux comprendre mais je ne pense pas que cela soit une bonne idée.

              GillesMangin-Voirin a écrit:

              De plus il faut encore maintenant que je transpose le résultat de mon tableau $listeLibre qui contient dans mon exemple :

              array(4) { [6]=> int(6) [8]=> int(8) [9]=> int(9) [11]=> int(11) }

              dans un autre tableau (à moins de pouvoir réorganiser celui-ci) sous une forme du genre :

              array(4) { [0]=> int(6) [1]=> int(8) [2]=> int(9) [3]=> int(11) }

              afin de pouvoir le parcourir pour l'afficher..

              Merci

              Parcours ton premier tableau pour réaffecter chaque valeur dans un nouveau tableau. Comme c'est un nouveau tableau les clés commencerons automatiquement à zéro. 

              Tu n'as pas besoin d'avoir un tableau commencent avec une clé numérique à zéro pour pouvoir l'afficher. Voir foreach pour parcourir un tableau.

              -
              Edité par AbcAbc6 21 février 2023 à 20:46:48

              • Partager sur Facebook
              • Partager sur Twitter
                21 février 2023 à 20:58:07

                Merci pour le changement d'indexation du tableau j'ai trouvé en PHP ceci :

                $listeIdLibreFinal = array_combine(range(1, count($listeLibre)), array_values($listeLibre));



                qui donne le résultat attendu :

                liste ID libre ;
                array(4) { [6]=> int(6) [8]=> int(8) [9]=> int(9) [11]=> int(11) }
                liste ID libre final ;
                array(4) { [1]=> int(6) [2]=> int(8) [3]=> int(9) [4]=> int(11) }

                le tableau part de 1 au lieu de 0 mais ce n'est pas un soucis toutes les entrées se suivent..

                ou alors :

                $listeIdLibreFinal = array_combine(range(0, count($listeLibre)-1), array_values($listeLibre));


                liste ID libre ;
                array(4) { [6]=> int(6) [8]=> int(8) [9]=> int(9) [11]=> int(11) }
                liste ID libre final ;
                array(4) { [0]=> int(6) [1]=> int(8) [2]=> int(9) [3]=> int(11) }

                Et la le tableau part bien de 0...

                Merci

                • Partager sur Facebook
                • Partager sur Twitter
                  1 mars 2023 à 12:03:00

                  Bonjour,

                  Je me permets de répondre sans apporter de réponse au sujet, mais pour poser une question.

                  En fait, pourquoi tu as besoin de ca ? J'ai du mal à trouver une application qui nécessite de ressortir la liste des clef primaire non utilisé.

                  Pour moi une clef primaire est un id technique, tu n'as meme pas besoin normalement de les connaitre, c'est juste un truc qui te permet d'avoir un id unique propre à chaque ligne, et qui permet de faire des jointures propres et optimisées avec d'autres tables qui se serviraient de cet ID.

                  Mais fonctionnellement, ca n'a normalement pas d'intéret de connaitre leur valeur.

                  Si tu te sers fonctionnellement de ton ID de clef primaire, c'est que ca a été mal pensé.

                  C'est le fameux "Dis moi pourquoi tu en as besoin, je t'expliquerai comment t'en passer".

                  En gros, c'est quoi le soucis d'avoir une Ruche 19 avec un ID à 12773 ?

                  Si tu as/veux toujours avoir un id qui match avec le nom de la ruche, alors le nom de la ruche ne sert à rien en table. C'est une colonne complètement inutile vu que tu peux générer le nom directement dans ton code à partir de ton id.

                  -
                  Edité par Tiffado 1 mars 2023 à 12:06:52

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 mars 2023 à 17:55:33

                    Merci

                    Effectivement, je me sers de l'ID pour numéroter les ruches, mais l'avantage d'avoir fait comme cela c'est que je peux trier mes ruches sur l'ID.

                    En fait l'ID était tout d'abord technique et comme il fallait bien une clé primaire il a cumulé les 2 fonctions...

                    Cette table n'a que 2 champs l'ID et le nom de la ruche,  moi je met Ruche 1, ... mais on pourrait bien la nommer Abeille, cerise,..

                    Voilà l'origine du truc..

                    Merci

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Connaitre le numéro de clé primaire non utilisé?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown