Java-JDBC Doppelte Einträge ignorieren?

Z3UZ

Ensign
Registriert
Mai 2007
Beiträge
128
Hallo,

ist es möglich Datensätze in die Datenbank zu schreiben und dabei Datensätze die schon vorhanden sind zu ignorieren?

MfG
Z3UZ
 
Definiere ignorieren? Die Datensätze werden doch sowieso alle anhand einer Unique ID identifiziert.
 
Also genau an sowas wie INSERT OR IGNORE INTO habe ich auch gedacht aber wenn ich das so anwende bekomme ich leider eine Exception die besagt:

java.sql.SQLSyntaxErrorException: ORA-00925: Schlüsselwort INTO fehlt
Ergänzung ()

Um es genauer zu erklären:
1. Ich lese Daten aus meiner Datenbank aus und speichere diese in Java in einer Liste
2. Dann füge ich meiner Liste in meinem Programm weitere Daten hinzu
3. Diese neue Liste möchte ich dann wieder in die Datenbank speichern

Hoffe das erklärt es ein bisschen besser
 
Zuletzt bearbeitet:
Wo liegt das Problem, die Datensätze aus deiner DB mit deiner (Array)List zu vergleichen und dann nur die neuen in die DB zu schreiben?
 
Es kommt drauf an, wofür das Ganze gedacht ist. Für n Hobbyprojekt kann man bestimmt das, was Hades vorschlägt, verwenden. Je nachdem, ob das ein einzelner Wert (bsp. Username) oder eine Klasse zum Abbilden des Datensatzes verwendet wird würden mir, auf die Schnelle, jetzt 2 Lösungsmöglichkeiten einfallen:

-) Caching der Datensätze: Sprich irgendwo im Speicher wird eine Kopie aller gelesenen Datensätze gehalten, damit nicht jedes Mal eine Lese-Operation auf die Datenbank durchgeführt werden muss. Somit könnte man einfach die Differenz zwischen Cache-Daten und Daten, die in die Datenbank geschrieben werden, bilden und diese dann einfach reinschreiben.

-) Jeder Datensatz, der aus der Datenbank in die Liste geladen wird, hat einfach ein boolean Flag, welches besagt "Ich steh bereits schon so in der Datenbank!". CUD-Operationen (Create, Update, Delete) würde das Flag auf False setzen. Beim Schreiben in die Datenbank braucht man nur über die Liste iterieren und die notwendigen Daten abspeichern.
 
Datenbanken bieten durchaus das gewünschte Feature (INSERT IGNORE, WHERE ... NOT IN etc.). Man müsste halt wissen, um welche Datenbank es sich handelt, um auf die konkrete (bzw. korrekte) Syntax verweisen zu können. Wobei der TE die Syntax wohl auch in der mitgelieferten Hilfe nachschauen könnte...
 
Ich bin kein Experte, daher würde mich eine fundierte Meinung dazu interessieren, bezüglich des Beitrages von soares.

Ist es nicht um einiges langsamer INSERT IGNORE, WHERE ... NOT in einer Datenbank zu durchlaufen als, alle Records in eine Liste zu speichern und die neuen Daten, mit der Liste miteinander zu vergleichen, zu filtern und dann in die Db zu schreiben?
 
Hades85 schrieb:
Ist es nicht um einiges langsamer INSERT IGNORE, WHERE ... NOT in einer Datenbank zu durchlaufen

Das sind zwei Möglichkeiten, das gewünschte zu erreichen. INSERT IGNORE unterstützt nicht jede Datenbank. Je nach Datenbank gibt es noch andere Möglichkeiten.

Verbindlich lässt sich die Frage nach der Performanz nicht beantworten, da hier viele Variablen eine Rolle spielen. Generell sind Datenbanken bei korrekter Verwendung aber durchaus (sehr) performant und ich würde SQL hier eigenem Code vorziehen. Im Zweifel fängt man sich eine neue Fehlerquelle ein, außerdem bedeutet es wesentlich mehr Aufwand. Falls man ein Performanzproblem haben sollte, kann man immer noch umschwenken. First make it work...
 
Da die neuen Entitaeten wohl noch keine ID haben, würde ich die Liste einfach durchtackern und die mit ID == null persistieren. Aber kann man bestimmt auch anders machen.
 
Zurück
Oben