# Schnelle Methode um zu testen ob Datensatz existiert



## Kartoffel (17. Aug 2009)

Hallo zusammen,

ich hab da mal ein Problem...

Ich muss in eine Datenbank mehrere neue Zeilen schreiben, allerdings nur, wenn der Datensatz nicht schon existiert.

Um zu prüfen ob der Datensatz existiert benutze ich zur Zeit diese Query:


```
String query = "SELECT FIRST 1 " + columnName + " FROM " + tableName + " WHERE " + columnName + "=?";
```

Daraus mach ich ein Preparedstatement und benutze die Query jedesmal wieder für meinen Test, aber mit anderen Parametern.

Funzt auch alles, nur is der Test auf "Vorhandensein" der Teil, der am meisten Zeit benötigt. 
Die Zeit gaht drauf, wenn ich das Resultset öffne bzw. wenn ich auf den ersten Datensatz springe: 


```
rs = stmt.executeQuery();
 boolean hasNext = rs.next(); //<---- hier
```

Wenn hasNext true ist, weiß ich dass der Datensatz schon vorhanden ist. Nur dauert mir das zu lange. Hat Jemand einen Tipp, wie ich das schneller hinbekomme?
Es muss immer nur ein Wert in einer Spalte verglichen werden.


----------



## SlaterB (17. Aug 2009)

viellleicht was mit 
update table set x = x where ..;
Rückgabewert von executeUpdate() 0 oder >0?


----------



## sparrow (17. Aug 2009)

```
String query = "SELECT COUNT(*) AS anzahl FROM " + tableName + " WHERE " + columnName + "=?";
```

Wenn anzahl > 0 ist der Datensatz schon da.
Ich bin mir aber bei mySQL nicht sicher ob das wirklich schneller ist als das Suchen nach dem ersten Datensatz.

Suchen muss er allerdings so oder so, schneller gehts mit einem INDEX auf columnName, ansonsten schmeißt er jedesmal einen sequentiellen Scan aller Datensätze an. Das dauert nun mal.


----------



## Kartoffel (17. Aug 2009)

Das mit COUNT() hab ich auch schon versucht, is allerdings langsamer als die Query, die ich im Moment benutze. Ein Index ist auch auf der Spalte.
Ich versuch das mit dem Update noch, vielleicht bringts ja was, wenn nicht hab ich wohl Pech . Das Ganze ist ja eigentlich auch nicht langsam, dauert ca. 80ms -100ms, nur wenn man mal 50000 Datensätze einliest, dann summiert sich das.

Danke!


----------



## ARadauer (17. Aug 2009)

was hat die spalte für einen typ und wie viele sätze hast du da ungefähr drin?


----------



## SlaterB (17. Aug 2009)

> dauert ca. 80ms -100ms, nur wenn man mal 50000 Datensätze einliest, dann summiert sich das.

alle auf einmal testen?


----------



## sparrow (17. Aug 2009)

SlaterB hat gesagt.:


> alle auf einmal testen?


Oder zumindest Blockweise.


----------



## Kartoffel (17. Aug 2009)

@ARadauer: Typ String. Bis jetzt hab ich so 60000 Stück drin.

@SlaterB: Ne das is immer ein Datensatz der da geprüft wird. Wenn ich also 60000 neue Datensätze einlese, dann muss ich auch 60000 mal die Prüfung durchführen. 
Und 60000 * 100ms = lang


----------



## SlaterB (17. Aug 2009)

dass du es bisher einzeln prüfst, ist schon klar,
die Frage ist, ob du das ändern kannst, da ist die Begründung bisher etwas dürftig,

blockweise geht natürlich auch, wenn 100 Prüfungen 500ms dauern, dann spart das schon 95%


----------



## gizmo (17. Aug 2009)

Vielleicht ist das was du suchst: MySQL: INSERT IF NOT EXISTS syntax Autarchy of the Private Cave


----------

