Derby/JavaDB Insert Statement Probleme

Rin

Mitglied
Hallo Leute,

ich hab folgendes Problem mit einem Insert Statement 2 funktionieren bis jetzt einbandfrei nur genau bei diesem :

SQL:
"INSERT INTO Incidents2(SDCallID,Eroeffnet,Beschreibung,EinmelderID) " +
								"SELECT import.SDCallID, import.Eroeffnet, import.Beschreibung, einmelder.EinmelderID " +
								"FROM Import2 import, Einmelder2 einmelder " +
								"WHERE ((import.Betroffener IS NOT NULL AND import.Betroffener <> '') " +
								"AND import.Betroffener = einmelder.Einmelder) " +
								"OR ((import.Betroffener IS NULL OR import.Betroffener = '') " +
								"AND import.Einmelder = einmelder.Einmelder)"

obwohl ich den gleichen Tabellen Aufbau (Datentyptechnisch) wie bei den anderen verwende nämlich diesen hier :
SQL:
CREATE TABLE Incidents2 (SDCallID VARCHAR(40) PRIMARY KEY," +
														"Eroeffnet VARCHAR(30)," +
														"Beschreibung VARCHAR(255)," +
														"EinmelderID INT)

schreibt er mir jedes mal diese exception:
Java:
java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL110601095210540' defined on 'INCIDENTS2'.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(Unknown Source)
	at Classes.Import.ImportFromCsvToAccessTable(Import.java:136)
	at Forms.ImportForm$2.actionPerformed(ImportForm.java:216)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

hoffe ihr könnts mir helfen

danke LG Rin
 
Hallo,

wenn ich die Fehlermeldung richtig interpretiere, wird beim Insert ein oder mehrere identische Primärschlüssel verwendet. Der Primärschlüssel muß aber einmalig sein.

Schau dir mal an, was bei deiner Abfrage
SQL:
"SELECT import.SDCallID, import.Eroeffnet, import.Beschreibung, einmelder.EinmelderID " +
                                "FROM Import2 import, Einmelder2 einmelder " +
                                "WHERE ((import.Betroffener IS NOT NULL AND import.Betroffener <> '') " +
                                "AND import.Betroffener = einmelder.Einmelder) " +
                                "OR ((import.Betroffener IS NULL OR import.Betroffener = '') " +
                                "AND import.Einmelder = einmelder.Einmelder)"
herauskommt und ob da aus irgendeinem Grund die SDCallID nicht einmalig ist.
Oder in deiner Tabelle Incidents2 kommt einer oder mehrere dieser Primärschlüssel schon vor.

MfG
hansmueller
 
hm... leider hab ich vergessen wie ich den result bzw den execute in string ausgeben kann =/ Peinlich peinlich, und ich drop aus test zwecken im moment jedes mal die Tabelle wieder das heißt die wird vor jedem Statement test neu erstellt und jo also rein teoretisch kann kein datensatz drinnen stehen ich hol die daten aus einer csv datei es ist nur extrem anstrengend da jetzt jeden einzelnen datensatz zu kontrollieren ob da duplikate vorkommen da das knapp 1500 datensätze sind .........

hm........ falsch definiert hab ich es auch nicht die tabellen spalten hm.....
 
du kannst auch den Primary Key testweise entfernen, in die Tabelle dann hoffentlich erfolgreich einfügen und danach nach Doppelten suchen
(GROUP BY id HAVING Count(*) > 1)

in Excel:
nach Id sortieren, in Spalte daneben Formel =IdSpalte2-IdSpalte1, kopieren über alle 1500 Zeilen, schauen ob irgendwo 0 rauskommt
(Filter, oder Werte kopieren + neu sortieren)
 
Hallo,

importiere die csv in ein Tabellenbearbeitungsprogramm deiner Wahl, sortiere nach der Spalte, die den Primärschlüssel enthält. Dann erstellst du in einer leeren Spalte eine Formal nach dem Schema: Wenn Primärschlüssel der Zeile x ist gleich dem Primärschlüssel der darunterliegenden Zeile dann gib "Treffer" aus. Kopiere diese Formel die ganze Spalte herunter und suche dann nach dem Eintrag "Treffer".

Alternativ kannst du ja eine TESTIncidents2-Tabelle machen, in der es keinen Primärschlüssel gibt. Dann kannst du dort nach doppelten Einträgen per SQL suchen. Wenn diese Tabelle dann bereinigt ist, kannst du die Einträge in deine Incidents2-Tabelle kopieren.

MfG
hansmueller
 
könnte es sein das er wenn ich den PK definiere und er einschreiben will nur die ersten paar zahlen vergleicht weil die eben bei der SDCallId meistens gleich ist


lg
 
ein PK ist verletzt wenn irgendein Doppelter Schlüssel vorliegt, wenn die Fehlermeldung kommt wurde etwas Doppeltes gefunden,
wie kommst du grundsätzlich auf die Idee, dass es daran liegt, dass 'nur' etwas weniger gesucht wird?
so abwegig das überhaupt für eine DB ist, würde es höchstens das Übersehen von etwas erklären, aber doch nicht das Finden von etwas?!

> weil [..] eben bei der SDCallId meistens gleich ist
tada, dies ist das wo dir ein PK die lange Nase zeigt, überrascht?
 
hm. da hast recht na ka es kam mir nur komisch vor ich hab es durch einen filter bzw hab ich überprüft mehrmals ob es doppelte treffer gibt aber es kamm kein treffe zu stande ....

egal hab ein anderes problem noch =/ ich hab noch eine tabelle um so stammdaten zu speichern wie er soll einen gewissen prozentsatz nur ausslesen aus der tabelle einmelder diese prozent zahl will ich in eine eigene tabelle speichern nur aus welchem grund auch immer entweder er kann sie nicht auslesen oder er will sie nicht speichern er findet nichts egal wie oft ich Update statment verwende........
 
> hab ich überprüft mehrmals ob es doppelte treffer gibt aber es kamm kein treffe zu stande
wie passt das denn zur vorherigen Aussage
> weil die eben bei der SDCallId meistens gleich ist
bzw. was meintest du mit dieser?

--------

der neue 3-Zeilen-Satz ist wirklich übel, worum gehts denn da?
findet nicht direkt über SQL irgendein Import statt? und dabei soll irgendwo eine Prozentzahl aktualisiert werden?
nicht gerade ein Standard-Verhalten von SQL, zumal 1500 Zeilen doch nicht lange dauern können

willst du in Java parallel irgendwas machen?
 
nur die ersten 4 zahlen sind gleich das is eine 8 stellige zahl das meinte ich das die meistens gleich sind die ersten 4 zahlen

also ich starte mein programm dann wählt man die csv datei die daten in der Datei importier ich in die JavaDB und verteile sie auf die jeweilgen tabellen, soo ich kann die daten via einer JTable verwalten so
jetzt habe ich noch eine tabelle names config stammdaten wie z.B.: wie viel prozent der einmelder befragt werden sollen und wie lang sie an einer umfrage nicht mehr teilnehmen können

diese Prozent und die Tage dafür speicher in in der tabelle config jetzt hab ich setter und getter für diese daten nur obwohl die tabelle config vorhanden ist will er mir die Daten nicht speichern und er findet die zahlen nicht ...... warum auch immer -.-

Java:
public class tp_getter_setter {
	private static String prozent,tage,text;

	public static void setProzent(String prozent){
		try {

			Connection con = DriverManager.getConnection("jdbc:derby:kuzudb;");
			int proz = Integer.parseInt(prozent);
			String strSQLProzentstmt = "UPDATE config SET Prozent = " + proz;
			Statement prozentprep = con.createStatement();
			prozentprep.execute(strSQLProzentstmt);
			System.out.println(proz);
			System.out.println(strSQLProzentstmt);
			con.close();

		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}

	}
	public static String getProzent()throws SQLException{

		try {

			Connection con = DriverManager.getConnection("jdbc:derby:kuzudb;");
			String strSQLProzentstmt = "SELECT Prozent FROM config";
			Statement prozentprep = con.createStatement();
			ResultSet rs = prozentprep.executeQuery(strSQLProzentstmt);

		if(rs.next())
		{
			prozent = rs.getString(1);
			System.out.println(prozent);
			con.close();
		}
		else
		{
		System.err.println("es wurden keine Tage gefunden!");
		}

		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}

		return tp_getter_setter.prozent;


	}

	public static void setTage(String tage){
		try {

			Connection con = DriverManager.getConnection("jdbc:derby:kuzudb;");
			int tag = Integer.parseInt(tage);
			String strSQLtagestmt = "UPDATE config SET Tage = " + tag;
			Statement tageprep = con.createStatement();
			tageprep.execute(strSQLtagestmt);
			System.out.println(tag);
			System.out.println(strSQLtagestmt);
			con.close();

		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	public static String getTage(){

		try {

			Connection con = DriverManager.getConnection("jdbc:derby:kuzudb;");
			String strSQLtagestmt = "SELECT Tage FROM config";
			Statement tageprep = con.createStatement();
			ResultSet rs = tageprep.executeQuery(strSQLtagestmt);

		if(rs.next()) {
			tage = rs.getString(1);
			System.out.println(tage);
			con.close();
		}
		else
		{
		System.err.println("es wurden keine Prozent gefunden!");
		}
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}

		return tp_getter_setter.tage;
	}

	public static void setText(String textvar, String Link){
		tp_getter_setter.text = textvar.replace("(LINK)", Link);
	}
	public static String getText(){

		return tp_getter_setter.text;
	}

}

das is der code von den settern und gettern und er findet keine zeilen ..... obwohl ich beim start des programms die daten einschreiben lasse in die tabelle config

danke lg
 
> nur die ersten 4 zahlen sind gleich das is eine 8 stellige zahl das meinte ich das die meistens gleich sind die ersten 4 zahlen
das verstehe ich nun, dann macht die nur-Suche Sinn, ja, so sollte es aber hoffentlich nicht sein

----

UPDATE config SET Prozent = 4
aktualisiert alle Einträge in der Tabelle, setzt überall die Spalte Prozent auf 4,
wenn es aber keinen Eintrag gibt, dann wird beim SELECT auch nix rauskommen,

du musst am Anfang eine Zeile einfügen,
schau dir auch den Rückgabewert von [c]tageprep.execute(strSQLtagestmt);[/c] an, wieviele Einträge geändert wurden
 
UPDATE config SET Prozent = 4
aktualisiert alle Einträge in der Tabelle, setzt überall die Spalte Prozent auf 4,
wenn es aber keinen Eintrag gibt, dann wird beim SELECT auch nix rauskommen,

du musst am Anfang eine Zeile einfügen,
schau dir auch den Rückgabewert von [c]tageprep.execute(strSQLtagestmt);[/c] an, wieviele Einträge geändert wurden

🙂 danke das hilft ungemein werd ich gleich mal überprüfen und ein insert machen um das zu checken 😉

lg

ps.: ich lass den post mal als offen wenn ich noch fragen habe
 
Hi leute ich habe ein neues Porblem .... =/ das alte is fertig nur habe ich jetzt ein problem mit einem SQL Statement

SQL:
UPDATE Einmelder2 SET Gesperrt = 0 WHERE LetzteUmfrage < DateAdd('d', -30, Date())

so derby schmeist mir immer die Exeption das die vorletzte ")" einen syntax fehler hervorruft =/ jetzt habe ich mich schon erkundigt was genau jetzt JavaDB/Derby unterstützt an SQL befehlen aber ich werd nicht schlau aus google im mom ka warum

hoffe ihr könnt mir helfen danke euch

LG Rin
 

Zurück
Oben