löschen Sie die doppelten Einträge

vector_ever

Mitglied
Hallo,

HTML:
StateId	   State_Name
1	     BW
2	     BY
3	     BY
4	     BE
5	     BB
6	     BR
7	     HH
8	     HH
9	     HH
10	     MV
11	     MV
12	     NW
13	     RP
14	     NW
15	     BB

wo StateId Auto_increment ist, jetzt gibt viele doppelte Einträge in State_Name spalte, was möchte ich am ende eine Tabelle genau so haben:

HTML:
StateId	   State_Name
1	     BW
2	     BY
3	     BE
4	     BB
5	     BR
6	     HH
7	     MV
8	     NW
9	     RP

Wo man die doppelte einträge löschen kann, und Ich möchte dass sofort mit oder nach Insert
Code:
query = "INSERT IGNORE into eumonis.federalState values(?,?)";
ps = con.prepareStatement(query);
	         	        	   
Iterator<FederalState> it = dataHolder.iterator();
	           while (it.hasNext()){
	        	   FederalState obj = it.next();
	        	   
	           ps.setInt(1, obj.getStateId());
	           ps.setString(2, obj.getState().toString());

	       	     ps.executeUpdate();
				}
Also auch versuchte ALTER IGNORE zu benutzen
Code:
String alter = "ALTER IGNORE TABLE eumonis.federalState ADD UNIQUE INDEX (State_Name, stateId)";
			 ps = con.prepareStatement(alter);
			ps.executeUpdate()
;

Aber nichts passiert (oder habe ich was falsches geschrieben)
Also was soll ich genau machen?
 
Zuletzt bearbeitet:
Hi,

das ganze lässt sich rein über SQL lösen:
SQL:
-- Bedingung: StateId wird nicht als Fremschlüssel für andere verwendet,
-- sonst gibts hier dangling references oder Datenverlust bei entspr. ON DELETE bedingungen

-- Lösche alle Einträge, deren State_Name
DELETE FROM eumonis.federalState WHERE StateId IN (
  -- Alle Id's der doppelten Einträge selektieren
  SELECT StateId FROM eumonis.federalState WHERE COUNT(State_Name) > 1
) AND StateId NOT IN (
  -- Die niedrigste Id nicht löschen!
  SELECT MIN(StateId) FROM eumonis.federalState WHERE COUNT(State_Name) > 1
)

Wenn dann jeder State_Name nur noch einmal vorhanden ist, dann kannst du den UNIQUE Key darauf setzen:
SQL:
ALTER TABLE eumonis.federalState ADD UNIQUE INDEX(State_Name);

Alle Queries sind von mir ausm Kopf schnell runter geschrieben, ohne Gewähr. Mach dir auf alle Fälle erstmal ein Backup der Datenbank!

Grüße,
BK
 
mit Java habe ich die folgende geschrieben:
Code:
String query = "INSERT IGNORE into eumonis.federalState values(?,?)";
String alter = "ALTER IGNORE TABLE eumonis.federalState ADD UNIQUE INDEX(State_Name)";
ps = con.prepareStatement(query);
                               
Iterator<FederalState> it = dataHolder.iterator();
               while (it.hasNext()){
                   FederalState obj = it.next();
                   
               ps.setInt(1, obj.getStateId());
               ps.setString(2, obj.getState().toString());
 
                 ps.executeUpdate();
                }
			 ps = con.prepareStatement(alter);
			 ps.executeUpdate(); //muste alle doppelte Einträge löschen

Aber bekomme ich Fehlermeldung referenziert zu letzten Zeile
Code:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'BE' for key 'State_Name'
Und bleibt kommt immer neue doppelte Einträge

Sollte ich was mit dem Kode ändern?
 
Ok, noch mal habe ich die Tabellen gelöscht und vom Anfang wieder gemacht
Code:
String query = "INSERT IGNORE into eumonis.federalState values(?,?)";
String alter = "ALTER IGNORE TABLE eumonis.federalState ADD UNIQUE INDEX(State_Name)";
ps = con.prepareStatement(query);
                               
Iterator<FederalState> it = dataHolder.iterator();
               while (it.hasNext()){
                   FederalState obj = it.next();
                   
               ps.setInt(1, obj.getStateId());
               ps.setString(2, obj.getState().toString());
 
                 ps.executeUpdate();
                }
             ps = con.prepareStatement(alter);
             ps.executeUpdate(); //muste alle doppelte Einträge löschen

Es funktioniert toll, aber nicht wie ich möchte

Spalte stateId ist autoincerment, aber was ich kriege
HTML:
StateId	   State_Name
8             BW
2	      BY
5	      BE
13	      BB
5	      BR
6	      HH
1	      MV
11	      VW
9	      RP

Also so will ich nicht, weil ich benutze StateId als FK bei anderen Tabellen
 
Hi,

dann musst du vor dem DELETE, wie ich eh als Kommentar dazu geschrieben habe, dir was anderes basteln, dass dir erst die FK richtig hinbiegt.

Grüße,
BK
 
Ja eben, hätte ich die Lösung alleine gewusst, hätte ich hier nicht gefragt, das Problem, ich weiß nicht wie kann ich genau so machen

Jetzt diese Finale Kode wo stateId FK ist.
Code:
// ///////////////////////////////
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(url, username, password);
			Map<Object, Integer> primaryKey = new HashMap<Object, Integer>();
			
			 //////////////////////////////////
			 //store FederalStates
			 query = "INSERT IGNORE into eumonis.federalState values(?,?)";
			 ps = con.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
			 for(Object o: dataHolder){
			 if(o instanceof FederalState){
			 FederalState obj = (FederalState) o;
			 
			 ps.setInt(1, obj.getStateId());
			 ps.setString(2, obj.getState().toString());
			 ps.execute();
			 ResultSet rs = ps.getGeneratedKeys();
			 if (rs.next()) {
			 primaryKey.put(obj,rs.getInt(1));
			 }
			 }
			 }

I versuchte echt was zu ändern aber konnte nicht alleine schaffen
 

Neue Beiträge

Zurück