Page 1 sur 2

reindexation

Posté : 30 juin 2005, 15:10
par laTulipe
bonjour,

j'ai un champ ID(int, auto increment, cle primaire) dans une table. suite a divers ajout et suppression, il y a des trous entre chaque ligne (on passe de 2 a 7 par ex).

ya t'il une commande qui permet de reindexer pour combler ces trous?????

merci

Posté : 30 juin 2005, 15:13
par zeus
C'est un sujet qui ammene souvent des débats :

Je commencerais donc par te demander pourquoi est-ce que tu veux faire ça ?

selon moi, une fois qu'une ligne dispose d'un index, il ne faut pas le modifier. En effet, si tu as dans l'avenir des tables qui comportent des clés étrangères vers cette table et que tu réindexe ta table, tu perds les relations

Posté : 30 juin 2005, 15:23
par laTulipe
je suis en train de chercher une solution pour afficher sur 3 colonnes une liste de pays provenant d'une table (ID, nom_pays).

c'est surement pas une bonne methode d'utiliser l'ID, comme tu l'as dit ya des pb de jointures. vais voir si je trouve autre chose.

sinon c'est possible de reindexer ou pas?

Posté : 30 juin 2005, 15:24
par zeus
Je crois, je vais chercher.

Mais pourquoi est-ce que tu as besoin de l'index pour afficher ta table ? :shock:

Re: reindexation

Posté : 30 juin 2005, 15:39
par Augure
bonjour,

j'ai un champ ID(int, auto increment, cle primaire) dans une table. suite a divers ajout et suppression, il y a des trous entre chaque ligne (on passe de 2 a 7 par ex).

ya t'il une commande qui permet de reindexer pour combler ces trous?????
sinon c'est possible de reindexer ou pas?
On suppose que ta table ce nomme T

Code : Tout sélectionner

Create table T_tmp ( ID int , ... (les autres colonnes) .... ) ; Insert T_tmp Select * from T Drop table T; Create table T_tmp ( ID int auto increment primary key, ... (les autres colonnes) .... ) ; Insert T ( .... toutes les colonnes sauf ID .... ) Select ( .... toutes les colonnes sauf ID .... ) from T;
Il faut aussi gérer les clé étrangers pointant sur T .... et ça c'est encore plus lourd !!!!

C'est à mon avis une mauvaise idée que de vouloir re indexer

PS : Dans mes équipes de développement j'interdis toujours la mise à jour des clé primaire.
PS : Si tu veux avoir un code "sans trou" je te conseille :

Code : Tout sélectionner

create table T ( ID int auto increment primary key , CODE int , ....) ;
Tu pourras faire toutes les mises à jour sur CODE que tu veux sans mettre en péril l'intégrité relationelle de ta base. Cependant bon courage pour tes utilisateurs qui verront les code changer parfois

Posté : 30 juin 2005, 15:40
par mere-teresa
Réindexer, c'est se casser la tête pour pas grand chose.

Si tu veux classer dans l'ordre : tu peux encore le faire, même avec des trous entre les numéros.

As-tu vraiment une bonne raison de vouloir que ces chiffres se suivent ?

Posté : 30 juin 2005, 17:16
par laTulipe
effectivement l'ID ne servait à rien, donc pas lapeine de reindexer.

voici mon code pour afficher sur 3 colonnes
		$query="select pays from pays";
		$result=mysql_query($query,$link);
		$nbLignes=mysql_num_rows($result);
		echo "<table>\n<tr>\n<td>";
		for ($i=0;$i<($nbLignes/3);$i++){
			echo mysql_result($result,$i);
			echo "<br />";
		}
		echo "</td>\n<td>";
		for ($i=($nbLignes/3);($i<$nbLignes*0.66);$i++){
			echo mysql_result($result,$i);
			echo "<br />";		
		}
		echo "</td>\n<td>";
		for ($i=($nbLignes*0.66);($i<$nbLignes);$i++){
			echo mysql_result($result,$i);
			echo "<br />";		
		}
		echo "</td></tr></table>";
		mysql_free_result($result);

Posté : 30 juin 2005, 17:22
par zeus
Je pense que ton code est friable si tu as un nombre de pays n'est pas un multiple de 3, surtout que tu utilise 0.66 au lieu de 2/3 (0.6666666...)

Je te conseille celui là qui est plus conventionnel et sécurisé
<?php
$query="select pays from pays";
$result=mysql_query($query,$link);

$i = 1;
?>
<table>
<?php
while ($a_result = mysql_fetch_array($result)) {
    if ($i == 1)
        echo "\t<tr>\n";
    echo "\t\t<td>".$a_result["pays"]."</td>\n";
    if ($i == 3) {
        echo "\t</tr>\n";
        $i = 1;
    } else
        $i++;
}
mysql_free_result($result);
?>
</table>

Posté : 30 juin 2005, 18:03
par laTulipe
j'aime bien ton truc

merci zeus

Posté : 30 juin 2005, 18:36
par laTulipe
en fait, c'est tres bien mais je voudrais les classer par ordre alphabetique du haut vers le bas et pas horizontalement !!!!

Posté : 01 juil. 2005, 09:14
par zeus
Ca pourrait être interessant de se pencher sur le sujet ...

Je pense qu'il faut construire un tableau temporaire qui permettra de construire le tableau HTML

Par contre j'ai pas le temps de m'y mettre, désolé :oops:

Posté : 01 juil. 2005, 11:53
par pjl
en fait, c'est tres bien mais je voudrais les classer par ordre alphabetique du haut vers le bas et pas horizontalement !!!!
Sur 3 colonnes ?
Tu comptes le monbre de pays ramené. Tu divises par 3, tu stockes ton résultat.
Tu affiches tes pays, tu comptes, arrivé au 1er tiers, tu change de colonne, idem pour le 2eme tiers.

Tu dois y arriver en travaillant le code déjà fourni par Zeus

Posté : 01 juil. 2005, 11:55
par zeus
En fait laTulipe avait déjà commencé un code de ce genre là et je lui ai déconseillé, du moins comme elle le faisait car ily a des tas de cas particuliers a gérer : nombres non multiples de 3, arondis à la louche , ...

Posté : 01 juil. 2005, 12:03
par pjl
pour ca que je lui ai dit de reprendre ton code.
Il a une valeur à changer et un calcul à faire et ca doit passer.

Posté : 01 juil. 2005, 15:37
par laTulipe
comme je suis presse et comme le nbre de pays ne bougera pas, j'ai fait un truc approximatif qui fonctionne
		$query="select paysID, pays from pays order by pays asc";
		$result=mysql_query($query,$link);
		$i=1;
		echo "<table width=\"600\">\n<tr>\n";
		while($row=mysql_fetch_array($result)){
			if($i==1){
				echo "<td valign=\"top\">\n";
			}
			echo $row["pays"]."<br />";
			$i++;
			if($i==12){
				echo "</td>\n";
				$i=1;
			}
		}
		echo "</td>\n</tr>\n</table>";
		mysql_free_result($result);
merci a vous en tous cas