sujet délicat: auto incrément
Mouais, une clef doit être une donnée abstraite qui n'a rien à voir avec le contenu de la table pour relier des tables ou distinguer les données (grossièrement).
Après, tu as plusieurs solutions pour générer ta clef. Mais coupler plusieurs champs, non pas besoin.
zebdinou pour les intimes / Blog : http://www.zebden.fr
Pourtant une clé, se calcule grace aux dépendances fonctionnelles.
C'est la théorie des ensembles.
Apres, c'est vrai que je suis plus dans le monde la théorie.
Surement qu'en pratique , c'est plus judicieux et performant d'utiliser un id comme clé, mais en tout cas, sur Oracle, en cours, on nous fesait prendre comme clé generalement des couples.
I am singing in the rain , I am happy again !!
Tout dépends du contexte surement. Mais des fois, faut pas trop se compliquer la vie.
zebdinou pour les intimes / Blog : http://www.zebden.fr
Si toute fois il faullait reclasser un champs. Est-ce que le code que je propose serait correct ?
<?php
// Il nous faut trouver le nombre d'informations enregistrées dans la base de données
// requête sql
$sql='SELECT id, position FROM ma_table';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on compte et le nombre trouvé doit être le nombre maximal dans le champs position. Si il y a 26 données, il y a donc 26 positions et la positions de la dernière données est 26
$nb_max = mysql_num_rows($req);
// remarquons que l'on part du principe où le champs position a pour première valeur 1.
// on vérifie donnée par donnée que tout est dans l'ordre et qu'il n'y ait pas de trous.
$nb_fetch = "1";
while ($data = mysql_fetch_array($req)) {
$data['id'] = $id; // on a simplifié la variable
if ( $data['position'] <= $nb_max ) {
// on vérifie que la position est bien celle qu'il faut si non, on la change
if ( $data['position'] != $nb_fetch ) {
sql2='UPDATE ma_table SET position="'.$nb_fetch.'" WHERE id="'.$id.'"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die) ^^
mysql_query($sql2) or die('Erreur SQL pour une reclassification !'.$sql2.'<br />'.mysql_error());
}
}
// on n'oublie pas après d'augmenter la valeur de $nb_fetch si non, toutes les positions seraient de 1
$nb_fetch = $nb_fetch + 1;
// on termine le reclassement
if ( $data['position'] > $nb_max ) {
mysql_close ();
echo'Le reclassement des positions est effectué!';
}
}
?>
On admet qu'il n'y a pas de position 0, et qu'il ne peut y avoir deux mêmes positions.
On peut placer ce code après chaque insertion si le champs position n'est pas auto incrémenté ( quoique, même quand c'est auto-incrémenté ...), ou après chaque suppression.
Vous pouvez me donner votre avis s.v.p ?
Necnom :)
Il y a aussi une autre solution qui consisterait à faire une selection des informations par requête. Et comme il est possible de classer les informations dans l'ordre croissant, on le fait et on les insère une par une dans un champs vide. Mais bon. Ce n'est pas automatique.
Necnom :)
le 27/07/2007 à 14:30
Bzh
Dis donc, si tu ne sais pas que faire du CPU de ton serveur, j'ai plein de tache à te proposer pour occuper ton serveur, qui, d'après tes idées, s'ennuie comme pas possible.
Non sérieusement, modifier le champ des clés primaires n'est pas une bonne idée pour deux raisons qui pour moi, parraissent primordiales :
1) La gestion des INDEX :
Si tu modifies la clé primaire, cela demande à ta base de donnée de RE-PONDRE tout son CLASSEMENT D'INDEX à chaque fois... Traitement complêtement farfelu. Demande à skyrock de ré-indexer TOUS LEURS INDEX ( tables des commentaires 1 200 454 918 enregistrements ).
2) Economie du cpu:
Un serveur de base de donnée travail tout de même beaucoup. Je trouve illogique de lui rajouter des taches suplémentaires tout simplement parce que le coté perfectionniste et mathématique du developpeur est touché par le NON respect de la suite mathématique logique U(n+1) = U(n) + 1.
C'EST RIDICULE !
Ton serveur à assé de taches à gérer, alors évite de lui demander des choses suplémentaires qui n'apporteront rien de plus hors mis la satisfaction personnel du developpeur !
Dans certains cas il ne s'agit pas pour une question de perfectionnement ou d'esthétique de faire une suite logique U(n+1) = U(n) + 1 ou même U(n) = Uo +n etc ....
Il s'agit comme dans l'exemple des positions, de pouvoir faire un reclassement utile et nécessaire.
Et je n'ai pas vu beaucoup de propositions jusqu'ici.
De plus, cette opération ne s'effectue pas 24h/24 ( c'est pas souvent ) alors je ne vois pas en quoi c'est si obligeant pour le serveur.
On prendrait pas la peine de demander de telle tâche si cela n'était pas nécéssaire. Ce n'est pas parce que des opérations comme celles-ci se font rares, qu'il faut systématiquement les exempter de toute programmation!
Necnom :)
Les positionnement se font grace a un champs supplémentaire, La globule l'as dit, sinon a quoi servirai l'auto-increment sur ta clé ?
I am singing in the rain , I am happy again !!
le 30/07/2007 à 22:39
Bzh
A occuper des gens qui ne savent pas que faire pour optimiser leurs sites... :p
bon je sors ------->[]
Il faut admettre que ma seconde proposition de créer un nouveau champs pour reclasser les informations dedans était idiot. Mais c'était une proposition! Personne n'a rien proposé et ça jusqu'à maintenant.
Mais pour le code que j'ai présenté, je ne vois en quoi il peut être nul.
Et je l'ai dit, en plus d'une table avec une clé primaire et un auto incrément il y a un champs position.
La Globule a bien présenté un code qui faisait un autoincrément du genre :
$nb = $last_nb + 1;
INSERT INTO ma_table ..blablaba ... VALUES("", "", "$nb", "")
La différence avec ce que je propose c'est que le champs ( où on a placé le $nb ) ne contient pas de trou. Et ceci est primordial puique, comme je l'ai précisé au début, il faut une position unique et cette position change en fonction des départs d'informations.
Si c'était inutile, le code de La Globule l'aurait été aussi. Et je ne pense pas que c'est inutile, et cela n'est pas de l'optimisation. Comme je l'ai précisé dans mon message précédent.
Ca aurait été inutile comme le dit Bzh si c'était une question d'esthétique, mais là, ce n'est pas le cas.
Si il y a mieux où si il y a un meilleur moyen pour me mettre un champs qui permet d'attribuer des positions et que celles-ci changent en fonction des suppressions, de manière à ce que la règle des positions soit respectée pour les membres ( qui sont identifiés par leur id : clé primaire + auto incrément non modifié ).
Dites moi ça me ferait vraiment plaisir de savoir.
Ps: C'est trop facile de dire qu'il a des gens qui s'ennuient à faire telles choses ....
Necnom :)