PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JDBC und Transaktionen



Born2Burn
30-06-2005, 23:33
Hallo,

ich benutze IBM DB2 und möchte dabei alle Datensätze aus einigen voneinander abhängigen Tabellen löschen. Die Tabellen selbst sind mit Fremdschlüsselbeziehungen miteinander verknüpft.
Da ich die Reihenfolge des Löschens nicht festlegen möchte, und da es auch Tabellen mit zyklischen Abhängigkeiten gibt, wollte ich alle Tabellen innerhalb einer Transaktion löschem.



con.setAutoCommit(false);

for(String tabName : nameLst){
con.createStatement().execute(
"DELETE FROM " + tabName);
}

con.commit();
con.setAutoCommit(true);



Fehlermeldung wird in Form einer SQLException mit Code -532 ausgegeben. Sinngemäß soviel wie das ich die Tabelle B nicht vor A löschen darf, da eine Fremdschlüsselbeziehung verletzt wird.

Leider fällt mir keine Lösung mehr ein, ein weiterer Versuch war der manuelle Aufbau einer solchen TA mittels



con.createStatement().execute("begin transaction; DELETE FROM A; DELETE FROM B; COMMIT");


brachte leider auch keinen Erfolg, zwar wurde kein Fehler mehr gemeldet, die Datenbank aber auch leider nicht gelöscht.

Bin dankbar für alle Hinweise, vielen Danke

mwanaheri
01-07-2005, 09:54
Ich fürchte du wirst die Löschreihenfolge festlegen müssen, denn wenn du vorgehst mit:

try{
löschen a;
löschen b;
löschen c;
con.commit();
}catch(SQLException sqle){
rollback
}

wird ja eine Exception ausgelöst, falls in löschen a eine Fremdschlüsselbeziehung verletzt wird. Wie du eine zyklische Abhängigkeit auflösen willst, ist mir dabei noch nicht klar.

Falls du aber die Tabellen ganz leeren willst, hilft vielleicht ein drop table.

Born2Burn
01-07-2005, 11:25
Danke für die Antwort, ich hab es schon beinahe befürchtet.

Das drop wollte ich nicht machen, da es doch einen erheblichen Aufwand bedeutet wieder alle Tabellen anlegen zu müssen.

Thomas Engelke
01-07-2005, 14:00
Hallo!

Mehr theoretisch: Kannst du nicht per Metaschema die Fremdschlüssel herausfinden und dann in entsprechend umgekehrter Reihenfolge löschen? Ansonsten fällt mir zu dem Thema nur "foreign key" und "references" sowie "on delete cascade" von mySQL ein. Kann DB2 soetwas nicht?

TME

Jasper
01-07-2005, 14:01
Danke für die Antwort, ich hab es schon beinahe befürchtet.

Das drop wollte ich nicht machen, da es doch einen erheblichen Aufwand bedeutet wieder alle Tabellen anlegen zu müssen.

wenn alle zeilen gelöscht werden sollen, nimmt man 'truncate table <bla>' anstelle von delete.

unter oracle setzt man die constraints einfach auf 'deferred', so dass die konsistenzprüfung erst am ende der transaktion vorgenommen wird. vielleicht hat db2 sowas ähnliches?


-j