Combler des champs dans DB ??

Eléphant du PHP | 135 Messages

23 avr. 2007, 17:48

Bonjour,

J'ai un petit problem avec ma base de donnée. J'ai des lignes qui sont incrémentées, par formulaire, dans la base( jusquelà tout est normale).
et des lignes qui sont aussi effacé parce qu'on en à plus besoin.

Cependant les champs d'une colonne contient des noms numérotés. Ce qui fait des trous dans la base quand les champs sont effacés . C'est pas gènant vous allez me dire sauf que au bout de plusieurs centaines de lignes c'est important.
Les numéros commence s'allonger alors que le nombre de champs n'est pas si élevé que ça . C'est chiant... pardon c'est embêtant (ou là là que c'est embêtant.)

Je me demandais comment faire pour combler ces champs.

Si vous pouviez me donner une direction je vous en serait reconnaissant.

David.
Des noeuds au cerveau!

Mammouth du PHP | 991 Messages

23 avr. 2007, 17:52

tu peux par exemple lister tous les numéro inutilisés puis les entrer dans un array et enfin les mettres dans ta requetes pour enregistrer dans ta bdd et si le array est vide alors la base va incrementer comme dab ^^
DevOps, Symfony4, Hoa

Eléphant du PHP | 135 Messages

23 avr. 2007, 18:36

En effet,

ça m'a l'air pas trop mal. Je vais abuser du array_push je crois :)

je mets le code C'est surement possible de l'améliorer. Si vous avez des idées.

Merci Thehawk :)
if ( is_dir ($dir)){
$files1 = scandir($dir);
 foreach($files1 as $key => $value){ 
    if ($value != '.' && $value != '..' && $value!='Thumbs.db' && !is_dir($dir."/".$value) ){
      $dira[]= $value;
    }
  }
$numdira = count($dira);
//__DB-test ___________________
include ("folder/startdb.php");
$n="hdt00000";
while (!$numdira==0) {
	foreach ( $dira as  $num=>$image){
		Mysql_select_db('MyDB'); 
	 	$requete="SELECT * FROM table where row='$n'";
    	        $valeur=mysql_query($requete);
    	        if (mysql_affected_rows()<>0){
     		        echo"$n : already exists.<br>";
			$n++;
     		        }else{
			echo "$n : doesn't exits, list the name.<br>";
			$numdira--;
			$n++;
    		        }
       }
}
 echo $numdira;
 echo "<br>";
print_r ($dira);
echo "<br>";
mysql_close ();
 }else{
 echo "$dir is not dir <br>";
 }
J'ai pas mis toutes les variables mais ceux qui veulent utiliser le code pourront ce dépatouiller je pense.

David.
Des noeuds au cerveau!

ViPHP
ViPHP | 5924 Messages

23 avr. 2007, 20:48

Moi j'aurais tout simplement fait 2 requètes SQL :

Code : Tout sélectionner

ALTER TABLE `machin` DROP `id`; ALTER TABLE `machin` ADD `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
En adaptant bien sûr à la table en question...

Eléphant du PHP | 135 Messages

23 avr. 2007, 21:08

En fait, je comprends pas bien.

Alter table ce n'est pas plutôt pour intervenir sur la structure de la table.??

Parce que, je parlais plutôt d'intervenir sur les données de la table.

Je vais regarder un peu plus en profondeur.

David.
Des noeuds au cerveau!

ViPHP
ViPHP | 5924 Messages

23 avr. 2007, 22:02

Oui mais dans l'hypothèse où tu utilises une clé primaire auto incrémentée, ce qui est la meilleure solution dans ce cas, supprimer le champ et le recréer réindexe automatiquement toutes les clés.
Sinon ya aussi une solution de transferer toutes les données vers une nouvelle table avec INSERT ... SELECT ...; et de renommer la table nouvellement créée.
Mais en tous cas il faut bannir les solutions par scripts qui sont inutiles dans ce cas, lourdes, et limitées par la quantité de données à réindéxer, alors que les serveurs SQL peuvent le faire beaucoup plus rapidement...

Edit :
Je viens de trouver une autre solution, qui marche pour tous les types de champs (sans clé primaire), et de manière beaucoup plus légère pour le serveur :

Code : Tout sélectionner

SET @tmp=0; UPDATE `machin` SET `id`=@tmp:=@tmp+1 ORDER BY `id` ASC;