Se passer de l'auto incrément

0/5 (14 avis)

Snippet vu 4 128 fois - Téléchargée 32 fois


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

Ajouter un commentaire

Commentaires

Magidev
Messages postés
249
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
28 août 2009
-
Je ne vois pas vraiment l'utilité vu que le but de l'auto incrément permet d'avoir un numéro unique pour chaque enregistrement. Et rien ne "Sature" il suffit de choisir le format adapté a ton champ, comme INT, BIGINT etc.

De plus, pour les Bases de données Relationnelles cela peut poser probleme, et meme de sérieux

Imagine que on utilise ton principe pour des utilisateurs
dans un forum par exemple.

Après chaque message du forum on attache l'ID de la personne qu'il l'a postée.

ID---MESSAGE---AUTEUR
0 Test 1
1 Bonjour 2
2 Test 3

A partir de la, l'administrateur décide de supprimer le compte de l'utilisateur 3, mais il ne va pas vider tout ses messages du forum car ils sont interessant pour la plus part

Quand on consultera un message, et que l'on voudra récupérer l'auteur, on se retrouve devant un probleme, si personne ne s'est inscrit entre temps, il n'y a pas d'enregistrement 3 , la c'est OK mais si quelqu'un s'inscrit entretemps, on se retrouve avec qqn dont l'ID est 3 et qui n'EST PAS l'auteur des messages.

Donc pour utiliser ta méthode sans avoir de problemes, il faudrait ré-attribuer tout les champs de la table forum a un auteur 0 si il est supprimé, mais voila le probleme, cela demande plus de traitement et de vérifications par code que cela n'économise de place dans la base ou de performance.

En lui même le code est intéréssant pour son fonctionnement. Mais je pense qu'il ne doit pas etre utilisé pour une application concrete de base de données sinon on se retrouve devant plusieurs dilemes surtout en cas de base de données relationnelles (tres courantes)

Bonne prog
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
bien vu Magidev, je te suis totalement sur ce point.

je rajouterai que si l'id a une signification par rapport aux données (par exemple, tu fais un script de votes pour une série de concours que tu organises, tu mets alors comme id le numéro du concours: il y a un sens direct), tu n'auras pas le problème de savoir s'ils se suivent ou pas: ça n'a plus de sens. Si par contre ton id n'est pas en relation directe avec les données: c'est uniquement un nombre qui permet d'identifier (justement) ces données précises, avec peu de mémoire, alors le fait que la série d'ID soit discontinue n'est pas un problème non plus: ce n'est pas une partie significative des données, on n'affiche jamais l'id, sauf dans les liens etc...

Donc on a bien que dans les deux cas qui peuvent se présenter, avoir une discontinuité dans les id ne pose pas de problème (même si on est bien d'accord que c'est moche :p)
cs_pepito
Messages postés
2
Date d'inscription
lundi 27 décembre 1999
Statut
Membre
Dernière intervention
20 octobre 2004
-
Il n'en demeure pas moins que, dans certains cas précis, il peut être intéressant d'employer cette fonction (une certaine idée de l'esthétique des séquences) et qu'elle valait la peine d'etre postée.
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008
-
Note bien que je ne discute pas le fait que ça ait été posté. Même en programmation, la "recherche" pure et gratuite a son intérêt, fut-il seulement pédagogique. Je donne simplement un argument qui va dans le sens de la remarque de Magidev: ok, le code est intéressant, mais ne l'utilisez pas à moins que ça ne se justifie (auquel cas poster ici svp ^^ je serais étonné de trouver une situation où ça s'applique pertinament).

D'ailleurs, je n'ai pas noté le code.
ehmarc
Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008
-
Salut
Bin moi j'en ai besoin :p enfin un peu modifier (bon l'architecture de ma base est pas tres jolie mais elle m'est imposé donc...)
Dans mon cas, les index me servent juste pour une sélection plus simple apres l'affichage (je renvoie le numéro d'index à la page suivante... avec mon lien) sinon j'ai entendu parler de moulinette qui ferai ce genre de truc proprement (voir le cas du phorum plus haut) mais ceux que j'ai trouver sont payant....

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.