# frage zum ausführen eines INSERT statements



## kubi (15. Aug 2006)

hallo leute!

ich hab ne kleine frage zu nem INSERT was ich mit einem PreparedStatement verusche.

ich habe ein table, welche schon drei spalten mit werten hat. 

mit einenm PreparedStatement veruche ich nun die ergebnisse einiger berechnungen in eine weitere spalte des gleichen tables zu schrieben. was jedoch passiert, ist, dass die erste zeile der neu gefüllten spalte da beginnt, wo die drei schon vorhandenen spalten enden ( um genauer zu sein, eine zeile nach der letzten der schon vorhandenen spalten.)

woran liegt das? 

ich weiss nicht genau, was ich da falsch mache.

vielen dank für eure hilfe.

grüsse,
k.


----------



## Caffè Latte (15. Aug 2006)

Hi,

ich habe nicht verstanden, was das INSERT macht. Kannst du das mal verdeutlichen?


----------



## kubi (15. Aug 2006)

hi!

hier mal der code: 


```
try {
	Statement s = con.createStatement();
	s.executeQuery("Select flow, simTime from link21data");
	ResultSet rs = s.getResultSet();
	while(rs.next())
	{
		oneRow.add(rs.getFloat("flow"));
		oneRow.add(rs.getFloat("simTime"));
		rows.add(oneRow);
	}
	rs.close();
	s.close();

	if (oneRow.size()>0)
	{          
		int minute = 1;
		int index = 1;
		Float starttime = oneRow.get(index);
							
		Float Value;
		Float Time;
		double meanValue = 0;
		int size = 0;
	
		while (index< oneRow.size())
		{
			Time = oneRow.get(index);
			Value = oneRow.get(index-1);
	
			if (Time<starttime+(minute*60))
			{               		
				meanValue += Value;
				size++;
				index+=2;                   
			}
			else
			{	
				if (size > 0)
				{
					meanValue /=size;
				}
                                try{
                                    
                                    PreparedStatement pSt;
                                    pSt = con.prepareStatement("INSERT INTO link12data (1minflow) VALUES (?)");
                                    pSt.setDouble(1, meanValue);
                
                                    pSt.executeUpdate();
                                    
                                }
                                 catch(Exception e){
                                    System.err.println("Failed: Insert Data");
                                    e.printStackTrace();
                                    System.exit(0);
                                }
				//System.out.println(meanValue);
				minute++;
				meanValue = 0;
				size = 0;                   	
			}
		}
		
		meanValue /=size;               		
		
	}
	else
	{
		System.out.println("no data");
	}
}
catch(Exception e)
{
	System.out.println("Error" + e);
}
```

im ersten teil berechne ich zeitabhaengige mittelwerte, um diese dann in eine neue spalte der gleichen tabelle zu schreiben.

was aber passiert, ist, dass die neu gefuellte spalte erst da beginnt, wo zB meine spalte "flow" endet. mit dem PreparedStatement wird also irgendiwe verschoben in die tabelle geschrieben.

ich hoffe ich habe das verstaendlich erklaert


----------



## SlaterB (15. Aug 2006)

ist es nich ein Standard in der Datenbankwelt, dass eine Tabelle aus einer festgelegten Anzahl an Spalten besteht?

wie sollten da verschiedene Zeilen (=Einträge, Tupel, Elemente) unterschiedliche Spalten (Attribute, Eigenschaften) haben


----------



## DP (15. Aug 2006)

poste mal nen dump aus deiner table vor/nach deinen aktionen


----------



## kubi (16. Aug 2006)

hallo dp

wie mach ich das mit dem dump (hab gelesen, dass ein dump ein backup ist).

bin noch nicht so erfahren mit datenbanken.

danke!
k.


----------



## SlaterB (16. Aug 2006)

du sollst einfach posten wie die Tabelle (oder die entscheidenen Zeilen) vor und nach dem Update aussehen,
also eine Ausgabe des Inhalts als Text z.B., oder Screenshot,

aus deinen Ausführungen (ein Eintrag hat die Attribute, der anderen andere Attribute) wird man nämlich nicht so recht schlau


aber ich scheine nun zu verstehen:
die Spalten sind alle schon vorhanden, und du möchtest nun eine bestimmte Spalte mit Werten füllen,
INSERT erzeugt dabei immer neue Zeilen, neue Einträge,

wenn du vorhandene Einträge ändern willst musst du UPDATE benutzen


----------



## kubi (17. Aug 2006)

morgen slaterB

ja! UPDATE ist das richtige mittel! 

aber ich hab jetzt das problem, dass ich alle zeilen meiner spalte nur mit dem letzten berechneten wert update. 

der INSERT befehl hat alle berechneten werte in korrekter form in die spalte geschrieben.

kann mir nicht erklären, wieso es mit insert klappt aber mit update nur der letzte berechnete wert reingeschieben wird.

woran kann das liegen?

vieleicht nochmal die berechneten daten in nem Array oder Vector zwischenspeichern?

danke!

k.


----------



## kubi (17. Aug 2006)

hallo nochmal!

ich hab folgendes versucht, nachdem ich die berechneten Daten in einem array gespeicher habe:


```
try{
PreparedStatement pSt;

pSt = con.preparedStatement("UPDATE myTable SET myColumn = ?");
for(int j=0; j<dataArray.length; j++)
{
pSt.setDouble(1, dataArray[j]);
pSt.executeUpdate();
}
```

aber immer noch nichts. mit UPDATE habe ich weiterhin nur den letzten wert im column.

mit INSERT gehts. aber da hab ich ja das alte problem.

 ???:L


----------



## DP (17. Aug 2006)

ist ja auch irgendwie klar. 

der updated deine column soweit mit werten, bis dein data-array durchgelaufen ist. das letzte update überschreibt alle bisherigen updates.

edit: bzw. jedes update überschreibt das update des vorgängers. deshalb ist bei dir nur der letzte wert in der db.


----------



## kubi (17. Aug 2006)

hi!

wie kann ich das vermeiden?

danke!


----------



## DP (17. Aug 2006)

ich verstehe nicht das du machen willst. alle werte in die db rein? dann insert - werte aktualisieren? dann update.

beim update noch eine where-klausel um zu definieren, welche row aktualisiert werden soll


----------



## kubi (17. Aug 2006)

hi!

ich möchte mit update die werte aktualisieren. 

aber wie mach ich das mit der where klausel? die werte sollen der reihe nach reingeschrieben werden, wie das auch bei nem insert passiert. 

hab gelesen, dass man bei mysql keine nummerierung für die rows hat. 

wie kann ich das nun hinbekommen, dass er mit dem ersten berechneten wert die erste zeile aktualisiert, mit dem zweiten wert die zweite zeile usw.

danke!
k.


----------



## DP (17. Aug 2006)

*schläfenmassier*

update = aktualisieren
insert = hinzufügen

insert into tabelle (name, gewicht) values ('hans', 87);

dann später

update tabelle set gewicht = 88 where name = 'hans';

mit einem update kannst keine neuen sätze hinzufügen sondern vorhandene aktualisieren.

mach mal nen screenshot von deiner tabelle und den werten und schreibe was wie aktualisiert werden soll. anders kommen wir nicht weiter.


----------



## kubi (17. Aug 2006)

Ergenbistabelle:

MEANVALUE
0
634.449292755127
808.146280924479
177.132595062256
82.9269027709961
206.768732706706
149.251998901367
43.165599822998
121.704502105713
500.7570215861
304.255653381348
54.25830078125
482.142424265544
281.926998138428
78.0941009521484
31.638599395752
78.439697265625
126.315998077393
1012.32035064697
193.244003295898
113.866996765137
63.1633987426758
0
23.3031005859375
123.946998596191
426.329498291016
231.448001861572
0
54.7023487091064
:
:
:
:

das sind die werte die ich mit dem code im ersten posting berechne und dann mit insert einfuege in der reihenfolge der berechnung einfuege.

wenn ich nun eine neue berechnung durchfuehre, dann schreibt update den letzten berecheneten wert in die tabelle (habe verstanden wieso)

ich will also in der selben reihenfolge, wie die ergebnisse nacheinander berechnet werden, diese tabelle updaten. 

...
sorry, ist nicht meine absicht, stress zu verursachen...


----------



## Caffè Latte (17. Aug 2006)

Hi,

nach welchen Kriterien willst du denn die Tabelle updaten? Da gibts ja kein eindeutiges Kriterium, ausser dem Wert selbst. Und auf den ersten Blick gibt es zumindest 0 mehrmals.

Wenn du dieses (miese) Datenbankdesign behalten willst, dann lösch jedes mal die Tabelle und erstell sie neu. Und  "Reihenfolgen" in dem Sinne gibts bei Datenbanken auch nicht.

Cust my 2 cents ...


----------



## DP (17. Aug 2006)

si. aber anstatt drop und create table machst du "delete from tabelle" und dann den instert. 

die reihenfolge sollte anhand der arraylist korrekt sein.


----------

