# MySQL Zeile löschen und gleich Optimieren



## Guest (21. Feb 2006)

Hallo,

ich habe einen Connect zu einer MySQL DB und will in einer Tabelle alle Zeile löschen deren ID (auto incremet) kleiner als z.B. 100 ist - das geht auch mit:

 ...

rs = stmt.executeQuery("DELETE FROM `protokoll` WHERE CONCAT(`ID`) < 100");

in der nächsten Zeile steht dann gleich das Optimieren:

rs = stmt.executeQuery("OPTIMIZE TABLE `protokoll`"); 
stmt.close();
conn.close();

Durch diesen Code werden die neuen Einträge trotz des Optimierens wieder vorn an den gelöschten Stellen aufgefüllt, bis der Überhang wieder belegt ist - dieser Überhang sollte aber durch das Optimieren auch gelöscht werden.
Kann es nun sein, dass die Laufzeit zum Optimieren nicht ausreicht? Wenn ich z.B. in XAMMP 100 Zeilen lösche und danach auf optimieren klicke werden die neuen Einträge auch richtig wieder hinten angehängt, nicht so hier im Beispielcode.


----------



## Gast (6. Mrz 2006)

Schade, kann wohl keiner helfen?!?


----------



## jrthies (7. Mrz 2006)

Anonymous hat gesagt.:
			
		

> rs = stmt.executeQuery("DELETE FROM `protokoll` WHERE CONCAT(`ID`) < 100");
> 
> in der nächsten Zeile steht dann gleich das Optimieren:
> 
> ...




Hab's selbst noch nicht probiert, aber vielleicht klappt es ja mit zwei Querys in einem String:

rs = stmt.executeQuery("DELETE FROM `protokoll` WHERE CONCAT(`ID`) < 100; OPTIMIZE TABLE `protokoll`;");

Nur so'ne Idee. Vielleicht weiß ja jemand was besseres...


----------



## Gast (7. Mrz 2006)

Hallo,
erstmal danke für den Tipp. Funktioniert leider nicht, da wird ein Fehler zurückgegeben wenn ich beides in eine Zeile durch ein ; getrennt schreibe.


----------



## Bleiglanz (7. Mrz 2006)

Wozu die backticks?

delete from protokoll where id<100

und

mehrere statements mit ; geht i.A. nicht, mach halt einfach für beide Befehle ein eigenes Statement


----------



## Gast (7. Mrz 2006)

Ja, gut gedacht - aber das erste Statemant ist wahrscheinlich noch nicht fertig wenn ich optimieren will. Ich muss irgendwie warten bis das löschen abgeschlossen ist und dann erst optimieren... Nur wie???


----------



## Gast (8. Mrz 2006)

So, hab das Problem gelöst!!! ;-)) man braucht für diese Abfragen kein ResultSet, sondern benutzt executeUpdate, dann sieht das Ganze so aus:

int f = stmt.executeUpdate("DELETE FROM `protokoll` WHERE CONCAT(`ID`) < 100"); 

//das Optimieren: 

int g = stmt.executeUpdate("OPTIMIZE TABLE `protokoll`");

stmt.close(); 
conn.close();

und schon funzt es - endlich...


----------

