Keine doppelten Datensätze einfügen

Status
Nicht offen für weitere Antworten.

mysql@java

Mitglied
Hallo,

ich möchte bestimmte Datensätze aus einer Tabelle(artikel) in eine andere Tabelle(translation), die später für die Volltextsuche dienen soll, einfügen. Dabei soll aber geprüft werden, ob der Datensatz schon vorhanden ist. Zusätzlich ist noch zu sagen, die neue Tabelle wird immer wieder aktualierst werden und die alte beinhaltet ein paar Hunderttausend/Millionen Datensätze (so genau kann ich das net sagen), deshalb sind Lösungsvorschläge wie "nachdem Einfügen doppelte löschen oder von der einen Tabelle in wieder eine neue Tabelle verschieben und doppelte filtern" für mich schwachsinnig und können weggelassen werden.

Ich hatte ma was von UNIQUE gelesen, aber auch nur in Verbindung mit Integer. Nur die Spalte, die nicht doppelt sein darf, ist ein Text (bestehend aus mehreren Wörtern).
REPLACE und INSERT IGNORE hatte ich mal versucht, aber das haute dann auch net wirklich hin... oder ich weiß einfach net, wie man es anwendet..



Ein kleiner Auszug aus dem Programm


Java:
    rs = st.executeQuery("Select a.ArtikelNr, a.Kurztext, b.Kurztext from artikel a, artikelfremdsprachen " + 
              "b where a.ArtikelID=b.ArtikelID and b.SprachenID=2"); 
     
    Statement st1 = con.createStatement();  
    while(rs.next()){ 
        st1.executeUpdate("insert into translation  (Deutsch, Quelle, QuelleNummer, Englisch) " + 
                "values ('"+rs.getString("a.Kurztext")+"', '1', '"+rs.getString("a.ArtikelNr")+"'," + 
                   " '"+rs.getString("b.Kurztext")+"') "); 
    }


Also beim ersten Durchlauf des Programms sind die Daten in der Tabelle ja korrekt, nur wenn ich dann weitere mache, fügt es ja immer die selben wieder ein.

Hoffe, jemand kann mir helfen <.<


Ähm ja.. vllt noch erwähnenswert, ich arbeite mit MySQL 5.0


EDIT: Mir is noch was eingefallen, nur weiß ich nicht wirklich, wie ich es realisieren soll:
SQL:
select ID from translation where Deutsch = rs.getString("a.Kurztext")
            	  if ID > 0 dann vorhanden, d.h. nicht mehr in translation einfügen
Die Spalte ID is der Index von der Tabelle translation.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Du könntest vor dem Einfügen per Select count... prüfen, ob der Eintrag schon vorhanden ist.
Oder Du könntest die entscheidenden Spalten als Primärschlüssel definieren, allerdings würde dann beim Einfügeversuch eine Exception geworfen werden.
Oder Du könntest zuerst den Eintrag - egal ob vorhanden oder nicht - löschen, und anschliessend neu einfügen.
 

Landei

Top Contributor
Schon beim Lesen mit DISTINCT Eindeutigkeit fordern.
Java:
    rs = st.executeQuery(
          "Select DISTINCT a.ArtikelNr, a.Kurztext, b.Kurztext from artikel a, artikelfremdsprachen " + 
          "b where a.ArtikelID=b.ArtikelID and b.SprachenID=2");

<Philosophiemodus>Generell nicht versuchen, Probleme auf Krampf da zu lösen, wo sie stören, sondern da, wo sie verursacht werden.</Philosophiemodus>
 
Zuletzt bearbeitet:

mysql@java

Mitglied
Das mit select count muss ich mir mal angucken, wie das geht. Hab keine Ahnung von SQL ^^

Die Daten jedesmal löschen und neu einfügen... naja.. Die werden schließlich immer mehr und bleiben nicht gleich, deshalb soll die Tabelle mit dem Programm immer wieder mal aktualisiert werden und nicht immer ganz neu geschrieben.

Und nur eine Spalte ist entscheidend -> Spalte Deutsch
und Primärschlüssel is auf translation.ID


@Landei: das versteh ich nicht ganz... die Abfrage für die Daten die rein sollen, stimmt schon, nur will ich beim Einfügen keine doppelten rein. Ich hab es mal mit DISTINCT getestet und keine Auswirkung (hätte mich auch ein wenig gewundert)
 

Michael...

Top Contributor
Eine Möglichkeit wäre folgendes:
Java:
rs = st.executeQuery("Select a.ArtikelNr, a.Kurztext, b.Kurztext from artikel a, artikelfremdsprachen "
	 + "b where a.ArtikelID=b.ArtikelID and b.SprachenID=2");
Statement st1 = con.createStatement();
Statement st2 = con.createStatement();
while(rs.next(){
	if (st2.executeQuery("Select * From translation Where Deutsch ='" + rs.getString(2) + "'")).next()) {
		st1.executeUpdate("insert into translation (Deutsch, Quelle, QuelleNummer, Englisch) "
			 + "values ('"+rs.getString(2)+"', '1', '"	+ rs.getString(1)+"'," + " '"+rs.getString(3)+"') ");
	}
}
Ist nur so hingeschmiert und lässt sich sicherlich noch optimieren.
 

velaluka

Aktives Mitglied
Hallo mysql@java,
schonmal in meinen Link gesehen? Wie wäre es mit
SQL:
INSERT into translation (Deutsch, Quelle, QuelleNummer, Englisch) 
     Select a.ArtikelNr, ..... from.....
    ON DUPLICATE KEY UPDATE deutsch="Aktuellen Text..oder so" ]
Dann lässt du die DB den ganzen Mist erledigen;)
Ansonsten würde ich dir noch empfehlen Prepared Statements zu verwenden...
Ciao velaluka
 

mysql@java

Mitglied
@Michael: es sah zwar gut aus, hat aber leider nichts gebracht >.<

@velaluka: ja, hatte mal reingeguckt und so hatte ich mit dem Programm auch angefangen, nur es net hinbekommen..
Ich versuch es mal damit nochmal.

zwischendrinn schonma danke für die ganze mühe :D
 

mysql@java

Mitglied
Java:
st1.executeUpdate("INSERT INTO bb_translation (csDeutsch, usQuelle, csQuelleNummer, csEnglisch) "+ 
            		" SELECT a.csArtnr, a.csKurztext, b.csKurztext from bb_artikel a, bb_artfsptxt " +
              		"b where a.ulArtikelID=b.ulArtikelID and b.ulSprachenID=2 ON DUPLICATE KEY UPDATE " +
              		"csDeutsch='"+rs.getString("a.csKurztext")+"' ");

Java:
java.sql.SQLException: Column count doesn't match value count at row 1

Naja.. ist eh klar. Aber anders fehlen mir wieder die ganzen Bedingungen und Bezüge. Ich krieg das mit einem Statement einfach nicht hin. Jetzt wurde mir wieder klar, warum ich zwei draus gemacht hab xD
 
Zuletzt bearbeitet:

velaluka

Aktives Mitglied
Hallo,
du willst einen Insert auf 4 Feldern machen, selektierst aber nur 3 in der Select Anweisung:noe:
Irgendwas möchte die DB da schon haben, ansonsten kannst du auch gleich die Spalte weglassen:), ansonsten sieht das Statement doch gut aus.
Aber anders fehlen mir wieder die ganzen Bedingungen und Bezüge.
Wieso du kannst doch die where Bedienung genauso an dein Select hängen wie vorher auch???:L Oder andersherum: Innerhalb des Insert Statement kannst du ein Select mit all seinen Möglichkeiten absetzen um die Menge für den Insert einzugrenzen....
Ciao velaluka
 
Zuletzt bearbeitet:

mysql@java

Mitglied
Das größte Problem ist halt, dass ich keine Ahnung von SQL hab.
Und das die Select-Anweisung falsch is, weiß ich auch xD
Nur, ich hab keeiiiineeee Ahnung wie es machen soll >.<

Oki, mir is was eingefallen - nur, wie mach ich das mit "Quelle", die leg ich doch selbst fest, die is ja immer "1", dazu gibts keine Spalte sonst wo.

Java:
st1.executeUpdate("INSERT INTO bb_translation (csDeutsch, usQuelle, csQuelleNummer, csEnglisch) "+ 
            			" SELECT a.csKurztext, '1', a.csArtnr, b.csKurztext from bb_artikel a, bb_artfsptxt " +
              		"b where a.ulArtikelID=b.ulArtikelID and b.ulSprachenID=2 ON DUPLICATE KEY UPDATE " +
              		"csDeutsch='"+rs.getString("a.csKurztext")+"' ");

Die Version funktioniert auch net, jetzt sind sogar noch mehr Daten drinne.

Was macht dieses ON DUPLICATE KEY UPDATE eigentlich genau? Mir scheint, als würde es die bereits eingefügen Datensätze verdoppeln und diese dann wieder verdoppeln xD
 
Zuletzt bearbeitet:

Landei

Top Contributor
@Landei: das versteh ich nicht ganz... die Abfrage für die Daten die rein sollen, stimmt schon, nur will ich beim Einfügen keine doppelten rein. Ich hab es mal mit DISTINCT getestet und keine Auswirkung (hätte mich auch ein wenig gewundert)

Einen hab' ich noch, einen hab' ich noch!1!!

Probiere mal:
Java:
rs = st.executeQuery("Select a.ArtikelNr, a.Kurztext, b.Kurztext from artikel a, artikelfremdsprachen "
     + "b where a.ArtikelID=b.ArtikelID and b.SprachenID=2 Group By a.ArtikelNr, a.Kurztext, b.Kurztext");
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Was macht dieses ON DUPLICATE KEY UPDATE eigentlich genau? Mir scheint, als würde es die bereits eingefügen Datensätze verdoppeln und diese dann wieder verdoppeln xD
Wenn ich es richtig verstehe, kann für den Fall, dass ein Datensatz mit demselben Schlüssel eingefügt werden soll, hier definiert werden welche Spalte mit welchem Wert aktualisiert werden soll.
Da Du aber als Schlüssel scheinbar eine ID per autoincrement verwendest, wird Dir das so nicht weiterhelfen. - Bitte um Korrektur, falls ich da was falsch verstanden habe
 

mysql@java

Mitglied
@Landei: Es fügt mir beim ersten ersten Durchlauf des Programms zwar keine doppelten Datensätze ein, aber bei den nächsten Durchläufen fügt es die selben nochmal ein ohne zu prüfen, ob dieser schon vorhanden ist und da bringt mir DISTINCT oder GROUP BY nicht viel <.<
 

mysql@java

Mitglied
Wenn ich es richtig verstehe, kann für den Fall, dass ein Datensatz mit demselben Schlüssel eingefügt werden soll, hier definiert werden welche Spalte mit welchem Wert aktualisiert werden soll.
Da Du aber als Schlüssel scheinbar eine ID per autoincrement verwendest, wird Dir das so nicht weiterhelfen. - Bitte um Korrektur, falls ich da was falsch verstanden habe

Ja, das stimmt.
 

mysql@java

Mitglied
SQL:
DROP TABLE IF EXISTS TRANSLATION; 
    create table TRANSLATION 
    ( 
       ID INT UNSIGNED NOT NULL AUTO_INCREMENT,      
       Quelle    SMALLINT UNSIGNED DEFAULT 0 COMMENT '1=Artikel,2=Beleg', 
       QuelleNummer CHAR(25)  DEFAULT '' COMMENT 'wenn Quelle=1 steht hier Artikelnr, wenn 2 dann die  Belegnr'  , 
       Deutsch text, 
       Englisch text, 
    PRIMARY KEY (ID) 
    ) 
    TYPE = MYISAM 
    ;

Könnte jemand die Spalte Deutsch auf UNIQUE setzen?
 

Michael...

Top Contributor
Könnte jemand die Spalte Deutsch auf UNIQUE setzen?
SQL:
create table TRANSLATION ( 
       ID INT UNSIGNED NOT NULL AUTO_INCREMENT,      
       Quelle    SMALLINT UNSIGNED DEFAULT 0 COMMENT '1=Artikel,2=Beleg', 
       QuelleNummer CHAR(25)  DEFAULT '' COMMENT 'wenn Quelle=1 steht hier Artikelnr, wenn 2 dann die  Belegnr'  , 
       Deutsch text, 
       Englisch text, 
       PRIMARY KEY (ID),
       UNIQUE(Deutsch)
)
Kann es denn wirklich nicht vorkommen, dass bei unterschiedlichen Artikel der gleiche deutsche Text vorkommt??
 

mysql@java

Mitglied
Die Tabelle translation hat 5 Spalten: ID, Quelle(=SprachenID), Quellennummer(=Artikelnummer), Deutsch(=Kurztext von Artikel), Englisch(=Kurztext Fremsprachen).
Grundsätzlich dient die Tabelle translation nur für die Volltextsuche(muss noch im TabellenQuellcode eingebaut werden später). Z.B. Suche ich alle Artikel, die das Wort "Fangrahmen" in der Beschreibung drinne haben. Dazu muss ich aber doch nicht die ganze Datenbank durchsuchen. Es reicht, wenn jede Artikelbeschreibung nur EINMAL in der Tabelle vorhanden ist, denn mit der Quellennummer kann man dann auf die einzelnen Artikel zurückgreifen. Das erspart Zeit und die Performance wird nicht so runtergezogen, als wenn es ein paar Millionen Datensätze pro Tabelle einzeln durchsuchen muss.

Achja: So einfach geht das mit UNIQUE nicht, hatte ich selbst schon so versucht.
Code:
1170 - BLOB/TEXT column 'Deutsch' used in key specification without a key length

Das heißt dann wohl, ich könnte kein TEXT Format nehmen, nur was bleibt? VARCHAR? Wie viel geht da maximal? 255? Mhm.. das dürfte nun wirklich nicht reichen.. -_-
 
Zuletzt bearbeitet:

mysql@java

Mitglied
Es scheint, als wäre die Lösung gefunden. Bin mir zwar noch net 100%-ig sicher, ob sie auch genau das macht, was ich will, aber werde wohl noch ein paar Tests machen, um mir vollkommen sicher zu sein.

Java:
rs = st.executeQuery("Select a.csArtnr, a.csKurztext,b.csKurztext from artikel a, artfsptxt " +
           		"b where a.ulArtikelID=b.ulArtikelID and b.ulSprachenID=2");
             
           	Statement st1 = con.createStatement(); 
                         
           // Kurztext von Artikel nach translation übertragen
            while(rs.next()){ 
        		// prüfen, ob schon vorhanden
            	rs2 = st1.executeQuery("select ulID from translation where csDeutsch = '"+rs.getString("a.csKurztext")+"' ");
            	boolean ok = rs2.next();
            	if (ok && rs2.getInt(1) > 0)continue;
            		
            	// falls noch nicht vorhanden 

            		st1.executeUpdate("insert into translation  (csDeutsch, usQuelle, csQuelleNummer, csEnglisch) " +
            				"values ('"+rs.getString("a.csKurztext")+"', '1', '"+rs.getString("a.csArtnr")+"'," +
            				" '"+rs.getString("b.csKurztext")+"') ");
            	
            }
 

Landei

Top Contributor
Sollte funktionieren, nur die Performance wird nicht so doll sein. Vielleicht kann man eine Stored Procedure schreiben, die diesen Check selbst macht und dann einfügt oder halt nicht.
 

mysql@java

Mitglied
Da die Tabelle translation eh noch Volltextindex bekommt, muss nur noch die Syntax angepasst werden und dann dürfte das auch weiter kein Problem sein.
 

mysql@java

Mitglied
Naja, für mich hat sich das hier erstmal erledigt, werde keine weiteren Arbeiten an diesem Programm/Datenbank machen. War ja auch nicht für mich.

Trotzdem danke für die Hilfe.

Jemand anders wird meine Arbeit wohl zu ende bringen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I H2 - GUI Tool.... sehe aber keine Tabellen Datenbankprogrammierung 2
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
Z Ein haufen Fehlermeldungen aber keine Ahnung warum... Datenbankprogrammierung 9
Z Ein Haufen Fehlermeldungen und keine Ahnung... (H2 DB mit Intellij und Scene Builder ) Datenbankprogrammierung 16
V keine Verbindung möglich (Access-DB) Datenbankprogrammierung 3
OnDemand Select * from bringt keine Rückgabe Datenbankprogrammierung 49
Kirby.exe Es werden keine Einträge in der Datenbank gemacht Datenbankprogrammierung 23
J Jar-Datei stellt keine Datenbankverbindung her Datenbankprogrammierung 3
J keine Werte vom PHP Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
H MySQL Datenbank auf Xampp nimmt keine Mediumblob an. Datenbankprogrammierung 0
S DB2 Express C - keine Verbindung zur Datenbank Datenbankprogrammierung 2
I Es kann keine Verbindung zum Server aufgebaut werden Datenbankprogrammierung 12
D Keine Datenbankverbindung Datenbankprogrammierung 4
M Keine Antwort der Datenbank bei updateQUery(); Datenbankprogrammierung 2
J SQL-Statement Trigger zeigt keine Wikrung PL/SQL Datenbankprogrammierung 2
W Keine ODBC-Verbindung zur MSAccess-Datenbank Datenbankprogrammierung 2
E Warum kann ich keine Datenbank mit DB2 erstellen? Datenbankprogrammierung 2
J Keine Verbindung zu MSSQL DB mit JDBC Datenbankprogrammierung 3
L Probleme mit DriverManager.getConnection(..) - Endlosschleife, Java Absturz, Keine Exception Datenbankprogrammierung 4
T JAR keine H2 driver? Datenbankprogrammierung 3
B Mysql speichert keine 0 alls String Datenbankprogrammierung 11
D Keine Einträge in die Datenbank Datenbankprogrammierung 5
E Derby/JavaDB Keine Reaktion von "insert into" im ActionListener Datenbankprogrammierung 22
Kenan89 Keine Datenbankverbindung möglich Datenbankprogrammierung 52
E JDO -> keine Maps Datenbankprogrammierung 2
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
C Derby/JavaDB JavaDB: Keine Connection Datenbankprogrammierung 7
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
C MySQL Keine Datenbankverbindung Datenbankprogrammierung 6
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
P Hibernate -> SQL verwenden und keine Entity Datenbankprogrammierung 19
B Es werden keine Tupel in Tabellen abgelegt Datenbankprogrammierung 2
F Kann keine Verbindung mit HSQLDB aufbauen Datenbankprogrammierung 2
C keine Verbindung zur MS-SQL-Datenbank mehr Datenbankprogrammierung 4
Y Keine verbindung mit der Datenbank Datenbankprogrammierung 2
D Keine Ausgabe der Daten Datenbankprogrammierung 3
C Keine Verbindung Datenbankprogrammierung 12
B JDBC txt File keine Row ID Datenbankprogrammierung 4
J JDBC - setAutoCommit(false) hat keine wirkung? Datenbankprogrammierung 2
S ResultSet enthält keine Daten Datenbankprogrammierung 2
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
P Es werden keine Daten mehr in die Tabelle eingefügt Datenbankprogrammierung 4
A Fehlermeldung: Keine Daten verfügbar Datenbankprogrammierung 2
M Hilfe - keine Connection zur DB Datenbankprogrammierung 4
C Keine Verbindung zu HSQLDB möglich Datenbankprogrammierung 22
G Keine Aussicht mit Prepared Statement Datenbankprogrammierung 10
I Nach export zur .jar keine verbindung mehr Datenbankprogrammierung 7
I Kann keine Daten aus ResultSet holen ? Datenbankprogrammierung 11
J Keine Connection zur MySQL Db Datenbankprogrammierung 6
I Keine Treiber-Klasse! Datenbankprogrammierung 9
K keine Verbindung zu mysql Datenbank Datenbankprogrammierung 11
W Keine leeren Felder bei Access Datenbankprogrammierung 15
M Bekomme keine Daten in die DB! Datenbankprogrammierung 11
H Kann keine Verbindung zur DB herstellen Datenbankprogrammierung 7
G linux mysql keine verbindung Datenbankprogrammierung 8
J Datenbank: Methode wegen doppelten User Datenbankprogrammierung 1
B Doppelte Zeilen einer Doppelten Spalte aus einer Tabelle entfernen. Datenbankprogrammierung 2
V Doppelten Datensatz vermeiden? Datenbankprogrammierung 7
M Datensätze in DataGrip (IntelliJ) Datenbankprogrammierung 1
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
R MySQL Datensätze in Textdokument Datenbankprogrammierung 7
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
R Große Datensätze, kleine Rechte Datenbankprogrammierung 8
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
E primaryKey auslesen - Datensätze abgleichen Datenbankprogrammierung 4
S Häufig vorkommende Datensätze Datenbankprogrammierung 4
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
J Datensätze löschen Datenbankprogrammierung 6
O Löschen vieler Datensätze mit Hibernate Datenbankprogrammierung 11
C Hibernate Datensätze finden Datenbankprogrammierung 17
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
S Anzahl Datensätze in db4o Datenbankprogrammierung 2
D Können nur angesehende Datensätze geloggt werden? Datenbankprogrammierung 4
F NUR 3 datensätze auslesen Datenbankprogrammierung 6
F MySQL Nur die Datensätze zurückgeben, in denen ein anderer Preis steht Datenbankprogrammierung 9
B Aktuellen Stand der Datensätze einer Datenbank anzeigen Datenbankprogrammierung 9
J SQL-Abfrage zur löschung doppelter Datensätze Datenbankprogrammierung 7
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J Datensätze aus der Datenbank holen Datenbankprogrammierung 3
S MySQl - Neue Datensätze "on the Fly" verarbeiten Datenbankprogrammierung 8
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
C Doppelte Datensätze Datenbankprogrammierung 11
T Datensätze effektiv einlesen Datenbankprogrammierung 4
ARadauer viele datensätze. Datenbankprogrammierung 3
I Anzahl unterschiedlicher Datensätze ausgeben Datenbankprogrammierung 2
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
S 50.000 updates auf 50.000 Datensätze Datenbankprogrammierung 3
M Datensätze zählen. Datenbankprogrammierung 6
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
M JDBC: Viele Datensätze in Tabelle einfügen: Wie? Datenbankprogrammierung 7
C Datensätze variabel hinzufügen Datenbankprogrammierung 4
K Ältere Datensätze archivieren Datenbankprogrammierung 4
C Datensätze in einer JComboBox auflisten Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben