Autor Zpráva
Majkee
Profil
Ahoj,

chtěl bych Vás poprosit o radu ohledně použití UPDATE/INSERTu v MySQL. Soubory .csv obsahuji ID, Popis a Cenu, potřeboval bych poradit rychlejší způsob než je ten, který používám, ptž. ve velkých .csv se upload neprovede, třeba po hodině se to zastaví apod.

Aktuálně používám (úryvek kódu):
(sloupec cat je indexem v tabulce)


$catid2 = $_POST['catid2'];
//prochazeni csv po radcich
while (($data = fgetcsv($handle, 10000, ";")) !== FALSE)
     {       
		$id       = Addslashes(Chop($data[0]));
		$title    = AddSlashes(Chop($data[1]));
		$price   = AddSlashes(Chop($data[2]));	
        	//testuju zda je pritomna zhoda v id
		$check =mysql_query("SELECT cat FROM pricelists where id='$id' and catid2='$catid2'");   
	        while($rmp=mysql_fetch_array($check))
        {
        $index = $rmp['cat'];    
        }  
	    if($index)
	    {
		$update ="UPDATE pricelists set title='$title', price='$price', modified=NOW() where cat=$index and catid2='$catid2'";	
		mysql_query($update) or die(mysql_error());	
				
		echo '<tr bgcolor="cccccc"><td>Přepis</td><td>'.$i++; 		
		echo '</td><td>'.$id;
		echo '</td><td>'.$title;
		echo '</td><td>'.$price;				
		echo '</td></tr>';		
		}
		else
		{
		$import ="INSERT INTO pricelists (cat,id ,title , price, modified) VALUES ('','$id','$title','$price', NOW())";
	        mysql_query($import) or die(mysql_error());
	        
                echo '<tr bgcolor="lightyellow"><td>Import</td><td>'.$i++; 
		echo '</td><td>'.$id;
		echo '</td><td>'.$title;
		echo '</td><td>'.$price;			
		echo '</td></tr>';      
        }     	      	
     }


Neumím použít INSERT...ON DUPLICATE KEY UPDATE ptž ID položek se v databázi někdy opakuje, nejde tam proto vytvořit index.

REPLACE nechci použít, ptž jsou v tabulce ještě nějaké sloupce, které chci ponechat beze změny a ne vkládat na novo.
Kajman_
Profil *
Neumím použít INSERT...ON DUPLICATE KEY UPDATE ptž ID položek se v databázi někdy opakuje, nejde tam proto vytvořit index.

Tak udělejte primární klíč na kombinaci 2 sloupců (id,catid2).
peta
Profil
"ve velkých .csv se upload neprovede, třeba po hodině se to zastaví apod. "
Co presne znamena velky?
Zkusil jsi transakce nez to takhle soukat prikaz po prikazu?
Phpmyadmin odkazuje pri uploadu velkych souboru na BigDump.php , zkoukni zdrojove kody, pouzil jsem to pro 60MB soubory.
Majkee
Profil
Kajman:

Bohužel i v této kombinaci (id,catid2) se najdou shody.

peta

Tak moje .csv zase nejsou tak velké:D největší má cca do 4MB.
Transakce jsem nezkoušel, ale přečetl jsem si, že jsou malinko pomalejší, tak nevím. Nevadí mi když se UPDATE provede znovu, ten BigDump je dobrý nápad, ale musel bych to implementovat do svého admin rozhraní, aby to ostatní uživatele zvládli taky.

Řešení možná udělám tak, že obejdu potřebu mít zhodné kombinace sloupců id, catid2 EDIT: (tak jsem zjistil, že to v mém případě nemůžů) a použiju INSERT...ON DUPLICATE UPDATE...
nebo mohl bych cyklus spustit 1000 krát, a pak jak kdyby znovu? Problémy to dělá když se zpracovává 10000 řádek a víc. Pak to nedojede a zastaví se to.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: