Trouver le prochain id de libre.

Contenu du snippet

MON PROBLEME ETAIT :

Dans mes tables de ma base de données, j'ai les valeurs suivantes. ces valeurs valent d'ID.
Pour des raisons de facilités, ces id ne sont pas en auto-Incrément.

Par défaut pour insérer un nouvel élément je fais un max(id) +1

Mais reprenons mon histoire ...
J'ai donc les valeurs :
1 - 2 - 3 - 4 - 5 - 6 - 7

Je delete le [4] et le [6] par exemple.

A l'insert suivant, comme a l'habitude je fais un max(id)+1.
Ce qui en toute logique me renvoi 8.

Mais voilà, j'aimerai que ça me renvoi tout d'abord [4], puis le [6] avant le [8].
En gros je souhaite combler les "trous" ...
___________________________________________________________________________________

J'ai trouvée une solution qui fonctionne bien. Le code qui suit est commenté et remplis de ECHO, afin de bien comprendre le cheminement.
Il est bien sûr a améliorer, à nettoyer etc ...
Mais je suis sur qu'il servira à des personnes comme moi, qui ont longuement cherché une instruction Mysql...

Avec un peu d'idée, on peut en faire une fonction, multi table qui renvoi simplement l'ID suivant dispo.

Source / Exemple :


//Chaine de connexion à la Bdd ici
include("connect.php");

// On recherche le MAX
$result=mysql_query("SELECT max(id) FROM matable WHERE cid='6' AND uid='1' ORDER by id ASC") or die(mysql_error());
$MAX= @mysql_result($result, 0);
echo "Nb Val. ( val MAX) : $MAX (prochain serait $MAX + 1 )<br>";
echo "<hr>";

// On regarde les valeurs qui existent dans la table
$requetesub=mysql_query("SELECT id FROM matable WHERE cid='6' AND uid='1' ORDER by id ASC") or die(mysql_error());
$totalsub = mysql_num_rows($requetesub);

// Pour info/test on affiche des résultats
echo "$totalsub ID relemnt occupé ( ";
while ($row = mysql_fetch_array($requetesub, MYSQL_ASSOC)) {
   echo " {$row['id']} ";
}
echo")<hr>";

//On remet le pointeur au début. afin de parcourir de nouveau le tableau
mysql_data_seek($requetesub, 0);

$i=-1; //(-1 pour tester la valeur 0)
$p=0; //sera le pointeur.

while($i<$MAX)
 {
   $i++;
   echo "<br> <u><b>Test de la valeur</u> : {$i} </b><br>";
   $row = mysql_fetch_array($requetesub, MYSQL_ASSOC);
   $val = $row['id'];
   
   if($val==$i)
    {
      echo"La valeur est = à i -> la preuve :($val=$i)";
      //on bouge le pointeur d'1 point
      $p++;
      @mysql_data_seek($requetesub, $p);
      // A ce niveau, à la dern. valeur on aura une erreur de dépassement.
      // Il faut donc prévoir un petit changement ou un test sup.
      // Le @ évite simplement l'affichage du message d'erreur.
    
    } else {
      echo"ID libre trouvé : <b>$i</b> ($val=$i)";
      //on ne déplace pas le pointeur
      mysql_data_seek($requetesub, $p);
      // ---- ICI on ferai un RETURN de l'ID si on fais une fonction ----

    }

  echo"<hr>";
}

Conclusion :


Je précise que ma clé est de ce type :
Pour chaque $GID il exsite 0 à plusieurs $CID
Chaque $CID ayant de 0àn $ID

Plus clairement :
GID CID ID
1 1 1
1 1 1
1 1 2
1 2 1
1 2 1
1 2 4
1 2 5
1 2 6
1 3 1
etc...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.