Se passer de l'auto incrément


Contenu du snippet

Cette fonction, très simple, permet d'avoir une suite de clés primaires continue, sans trou.

Source / Exemple :


/***************************************

    • Fonction getCode() **
    • ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^**
    • Prend le premier code dispo **
    • dans la table passée en paramètre **
                                                                              • /
function getCode($table){ //Si la table est vide, code=1 $sql='SELECT count(code) FROM '.$table; $rst=mysql_query($sql); $compteur=mysql_fetch_array($rst,MYSQL_ASSOC); if ($compteur['count(code)']==0){ $unCode=1; } // Sinon, on cherche un trou else{ $rst=mysql_query('SELECT code FROM '.$table.' ORDER BY code ASC') or die('impossible de récupérer les codes'); $i=1; while($code = mysql_fetch_array($rst,MYSQL_ASSOC)){ if($code['code']==$i){ $i++; } else{ $unCode=$i; } } } //si on n'a pas trouvé de trou, on prend le plus petit code vide if(empty($unCode)){ $rst=mysql_query('SELECT MAX(code) FROM '.$table) or die('echec de la requête'); $maxCode=mysql_fetch_array($rst,MYSQL_ASSOC); $unCode = $maxCode['MAX(code)']+1; } return $unCode; }

Conclusion :


L'auto incrément, c'est bien: Pas besoin de gérer les clés primaires, c'est la SGBD qui s'en occupe ...
Le problème c'est que quand on supprime un tuple, on a un trou
Par exemple
1 / martin
2 / Jean
3 / Paul
4 / Jacques

On supprime Paul et on ajoute Rémi

1 / martin
2 / Jean
4 / Jacques
5 / Rémi

On n'aura plus de tuple 3, et on perd une entrée dans la table. De quoi vite saturer une table si on fait beaucoup d'ajouts/suppression. (Bon c'est vrai, il faut vraiment en faire beaucoup)
Grâce à getCode, le tuple entré sera 3 / Rémi on ne perd pas de place !

Note: Le tuple 0 ne sera jamais retourné, c'est volontaire.
Il pourra servir de tuple tampon (par exemple pour échanger deux clés primaires)

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.