Löschen von Datensätzen in mehreren Tabellen einer DB
-
Hallo,
Ich habe wieder ein Problem mit meiner Datenbank. Und zwar möchte ich in meinem Programm bei Button druck einen Datensatz über mehrere Tabellen hinweg löschen.
ich habe bereits diverse Versuche getätigt aber nichts hat funktioniert.
Hier poste ich meinen Ansatz:Main->ADOQuery1->Close(); Main->ADOQuery1->SQL->Clear(); Main->ADOQuery1->SQL->Add("SELECT Tabelle1.*,Tabelle2.Typ FROM Tabelle2 INNER JOIN Tabelle1 ON Tabelle2.AnlagenNr = Tabelle1.AnlagenNr WHERE Tabelle2.Typ= '" + Main->DBComboBox1->Text + "'"); Main->ADOQuery1->Open(); Main->ADOQuery1->Delete(); Main->ADOQuery1->Open();
Ich vermute mal das die Funktion delete Datensätze die mit Inner Join verbunden wohl nicht löschen kann, denn ich bekomme beim ausführen des Codes eine Exxeption mit Insuficien Column Key. was ist am code falsch oder gibt es andere Löschfunktionen mit denen ich sowas löschen kann?
bis bald
-
Hallo
das Problem ist einfach, das aus der fertigen Abfrage nicht mehr korrekt abgeleitet werden kann, welche Datensätze darin verknüpft sind.
Am besten ist es, ein bzw. mehrere explizite Delete-Kommandos per SQL zu verwenden.
Also soDelete from <Tablename> where <Bedingungen, die die zu löschenenden Datensätze erfüllen soll>
und das pro betreffende Tabelle
bis bald
akari
-
HalLo,
Ich habe allerdings das problem, daß ich einen Datensatz aus einer Tabelle nicht löschen kann da ich in meinen Tabellen eine referentielle Integriät habe.
Kann ich erst aus beiden Tebellen die Zugehörigen Datensetze löschen (Delete Befehl)und dann erst execsql ausführen?
Auserdem habe ich bei dieser vorgehensweise das Problem, das ich nicht weiß,wie ich den Datensatz in meiner Tabell1 explizit ohne Inner Join auswählen soll, da ich in Tabelle nicht den Fremdschlüssel angewählt habe. Ich habe das zwar folgendermaßen versucht, habe aber immer eine Zugriffsverletzung bekommen.Main->ADOQuery1->SQL->Add("DELETE FROM Tabelle1 WHERE AnlagenNr=(SELECT
Tabelle2.Typ FROM Tabelle2 WHERE Typ = '" + Main->DBComboBox1->Text + "')");Main->ADOQuery1->SQL->Add("DELETE FROM Tabelle2 WHERE Typ = '" +
Main->DBComboBox1->Text + "'");
Main->ADOQuery1->ExecSQL();
P.S.wie kann ich bei langen Befehlen einen Zeilenumbruch machen?
-
Hallo
du machst dir da mehr Probleme als eigentlich nötig sind. Die Reihenfolge sollte sein :
- Bestimmen, welche Datensätze in beiden Tabellen gelöscht werden sollen.
Die betreffenden IDs werden zwischengespeichert.
- Die Datensätze aus der ersten Tabelle mit einer Delete-Anweisung ohne Join/Querverweis löschen, Ausführen
- Die Datensätze aus der zweiten Tabelle mit einer Delete-Anweisung ohne Join/Querverweis löschen, Ausführen
- eventuell Anzeige aktualisieren./Edit : Ich sehe keinen Grund, warum du nicht das erste Kommando komplett ausführen kannst und dann direkt danach das zweite. Solange du das gleich danach machst, wird es ja keine Löcher geben. Du kannst bloß nicht zwei Befehle auf einmal ausführen.
bis bald
akari