Impossible de vider une table

Eléphant du PHP | 94 Messages

05 sept. 2006, 15:52

Bonjour

A chaque fois que je fais un truncate de ma table, j'obtiens le message :
MyISAM table 'matable' is in use (most likely by a MERGE table). Try FLUSH TABLES.
Savez vous d'ou provient ce message ?

EDIT : ce message apparait après que j'ai importé environ 2000 enregistrements depuis un fichier texte assez volumineux. J'arrive à contourner le problème avec la commande FLUSH qui,d'après la doc, ferme toutes les tables ouvertes, et force les tables utilisées à se refermer. Cela vide aussi le cache de requêtes. Savez vous pourquoi je suis obigé de procéder ainsi ? Sur d'autres fichiers que j'importe, je n'ai pas le problème.
rspir

Eléphant du PHP | 94 Messages

09 sept. 2006, 22:34

Quelqu'un a t'il une idée pour mon problème ?
Modifié en dernier par rspir le 09 sept. 2006, 22:46, modifié 1 fois.
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 sept. 2006, 22:40

up
Il y a des manières plus élégantes de faire remonter son sujet. Les "up", c'est énervant.

Eléphant du PHP | 94 Messages

09 sept. 2006, 22:48

up
Il y a des manières plus élégantes de faire remonter son sujet. Les "up", c'est énervant.
j'en conviens : c'est corrigé. :oops:
rspir

Eléphant du PHP | 94 Messages

13 sept. 2006, 08:50

Bonjour

Quelqu'un a t'il une idée sur le sujet ?
En fait j'importe un fichier texte de 10Mo. Est ce lié ?

Mon souci devient embetant : en local je peux faire un Flush Tables mais je n'ai pas les privilèges ad hoc chez mon hébergeur.

Que faire ?
rspir

Mammouth du PHP | 19672 Messages

13 sept. 2006, 10:11

Cette erreur est curieuse : pourrait-on voir la structure de ta base, enfin à tout le moins pour les tables concernées ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

13 sept. 2006, 20:17

Ceci te suffit il ?
CREATE TABLE `matable` (
`ligne` int(11) NOT NULL auto_increment,
`dr` varchar(8) NOT NULL,
`grp` varchar(8) NOT NULL,
`id` varchar(17) NOT NULL,
`nature` varchar(8) NOT NULL,
`nom` varchar(128) NOT NULL,
`code` varchar(8) NOT NULL,
`adresse` varchar(128) NOT NULL,
`ville` varchar(32) NOT NULL,
`cp` varchar(5) NOT NULL,
`fax` varchar(32) NOT NULL,
`client` varchar(3) NOT NULL,
`swift` varchar(11) NOT NULL,
`gab` varchar(1) NOT NULL,
`handicap` varchar(1) NOT NULL,
`maj` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`ligne`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
En fait j'importe un fichier de 2000 enregistrements.
Il s'agit d'un fichier plat (txt) avec une longueur d'enregistrement de 4300 caractères.
Ma requete va faire des substr dans les zones qui m'interesse pour ensuite écrire dans la table
rspir

Mammouth du PHP | 19672 Messages

13 sept. 2006, 20:21

Mouais, ben c'est à priori pas là qu'est le problème : donc il faut voir quelles actions sont exécutées avant de faire un TRUNCATE et qui laissent la table ouverte.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

13 sept. 2006, 21:19

Voila le code du php.
C'est relativement simple :

	$connexion = connexion(user, pass, bdd, server);// connexion à la base
	  
	//$requete = "flush tables"; Flush tables pour vider le cache ?
	//ExecRequete ($requete, $connexion);

	$requete = "truncate matable"; //raz de la table
	ExecRequete ($requete, $connexion);

	$content=file("source/file.txt");//accès au fichier txt
	
	foreach($content as $num=>$ligne) // récupération du contenu
	{
	   $var1=substr($ligne,0,8); 						
	   $var2=substr($ligne,8,8);						
	   $var3=substr($ligne,16,17);					
	   $var4=substr($ligne,33,8);						
	   $var5=addslashes(substr($ligne,41,128));		
	   $var6=substr($ligne,169,8);					
	   $var7=addslashes(substr($ligne,177,128));		
          $var8=addslashes(substr($ligne,305,32));		
	   $var9=substr($ligne,337,5);					
	   $var10=substr($ligne,342,32);					
	   $var11=substr($ligne,374,3);					
	   $var12=substr($ligne,377,11);					
	   $var13=substr($ligne,496,1);					
	   $var14=substr($ligne,497,1); 					
	
	$requete = "INSERT INTO matable (dr, grp,id,nature,nom,code,adresse,ville,cp,fax,client,swift,gab,handicap) VALUES ('$var1','$var2','$var3','$var4','$var5','$var6','$var7','$var8','$var9','$var10','$var11','$var12','$var13','$var14')";
	ExecRequete ($requete, $connexion);
rspir