![]() |
Delphi-Version: 5
Mehrere Datensätze von mehreren Tabellen löschen
Hallo,
liebe Com ich habe mal wieder ein Problem: ich sitze immer noch an meiner DB (IBExpert) und meiner Delphi Oberfläche. ich habe überall gesucht, ohne überhaupt das stichwort zu kennen nachdem ich suchen sollte. ich habe ein pmMenu , dass Löschen soll... mir fehlt nur noch der richtige SQL befehl.. DELETE FROM TABELLE WHERE BEDINGUNG geht leider nicht, weil ich PK und FK's habe. Dort steht dann ich lösche nen PK auf den sich ein FK bezieht und desshalb gehts nicht. wie lösche ich also nun den datensatz und die datensätze in den anderen tabellen die mit dem einen zusammenhängen? hoffe es ist halbwegs verständlich. Liebe Grüße, |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Entweder in der richtigen Reihenfolge löschen (erst abhängige Datensätze, dann den Hauptdatensatz) oder eine entsprechende Löschregel festlegen (ON DELETE SET NULL/CASCADE).
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Wie immer danke für deine schnelle Antwort :),
wie würde das mit der reihenfolge als BSP aussehen? weil hintereinander wäre mir zu unsicher.... wenn da was schiefgeht dann habe ich den salat. |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Wie die richtige Reihenfolge aussieht, kannst nur Du wissen. Dafür muss man die Struktur der DB kennen. Meiner Meinung ist es aber besser, das in der Datenbank zu definieren (wie DeddyH schon sagte, ON DELETE CASCADE).
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
ok danke euch :)
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Nehmen wir mal eine 1:n-Beziehung, in der Du den Hauptsatz(1) löschen möchtest.
Code:
Nun soll aus der Haupttabelle der Satz mit ID 42 gelöscht werden.
Haupttabelle:
ID Name Detailtabelle: ID ID_Haupt --FK auf Haupttabelle Name Wuppdi
SQL-Code:
Das Ganze in einer Transaktion, dann sollte das auch klappen. Alternativ kannst Du natürlich auch eine SP dafür schreiben oder eben die schon erwähnte Löschregel definieren.
DELETE FROM Detailtabelle WHERE ID_Haupt = 42
DELETE FROM Haupttabelle WHERE ID = 42 [edit] *Oops* zu spät, Sch**ß Telefon :oops: [/edit] |
AW: Mehrere Datensätze von mehreren Tabellen löschen
ok danke :)
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Code:
meintet ihr das so?
delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';';
delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';'; es funktioniert nicht... kriege eine fehlermeldung. Obwohl ich Sendungsverfolgung_ID lösche steht da, das es nicht geht weil beim Kunden immer noch ein FK zu kunden besteht. so vielleicht? WHERE Sendungsverfolgung_ID = Kunden.Kunden_ID ??? SO sieht es insgesammt aus im Code:
Code:
procedure TDataconnect.deleteKunde(AKunde: TKunde);
var delKuQuery: TIBOQuery; delKuTransa: TIBOTransaction; begin delKuQuery:= TIBOQuery.Create(nil); delKuQuery.IB_Connection:=FDataBase; delKuTransa:= TIBOTransaction.Create(nil); delKuTransa.IB_Connection:= FDataBase; delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';'; delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';'; delKuQuery.ExecSQL(); delKuTransa.Commit; //TRY FINALY EINBAUEN delKuQuery.Free; delKuTransa.Free; end; |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Code:
wird wirklich die KundenID zur Sendungsverfolgung verwendet??
Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
ja, die Kunden ID ist der PK für die Sendungsverfolgung_ID.
damit 1 Kunde auch mehrere Bestellungen haben kann, aber gleichzeitig nix durcheinander kommt PS: Die Kunden_ID ist in der Tabelle Kunden |
AW: Mehrere Datensätze von mehreren Tabellen löschen
wenn ich nicht völlig übermüdet bin, hast Du Dir gerade selbst widersprochen.
Wenn ich als Kunde 17 3 Sachen bestelle haben drei Sendungen die ID 17 ? |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Zitat:
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
dann sagt er mir unknown: DELETE (Er versteht das 2te delete nicht)
delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';'; delKuQuery.SQL.Add(' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';'); |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Dann scheint es wohl wirklich so zu sein wie gestern bereits vermutet: eine Query kann nur einen einzigen Befehl ausführen. Du brauchst also entweder eine andere Komponente (welche, weiß ich allerdings auch nicht) oder musst die Befehle getrennt nacheinander zuweisen und ausführen.
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
:( mist...
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Ist doch so schlimm auch nicht:
- Transaktion starten - Detaildatensätze löschen - Hauptsatz löschen - Commiten - Bei Fehler zurückrollen (Rollback) Oder eine SP schreiben und die dann ausführen ;) |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Okay habe eine andere Möglichkeit entdeckt...
----try except block------- zB. Query.SQL.TEXT ' DELETE BLA FROM TABELLEBLA WHERE BLA_ID =.... ' Query.Exec.SQL Query.SQL.TEXT ' DELETE BLUB FROM TABELLEBLUB WHERE BLUB_ID =.... ' Query.Exec.SQL finaly... free. |
AW: Mehrere Datensätze von mehreren Tabellen löschen
:) danke hab ich auch grad so gedacht :)
vielen Dank wieder für deine Hilfe |
AW: Mehrere Datensätze von mehreren Tabellen löschen
@ Bummi. ja warum nicht? die Send_ID ist dann mit dem Kunden Verknüpft und hat die gleiche KundenSendung_NR...
was gesendet wird sieht man dann über die Bücher_ID zb |
AW: Mehrere Datensätze von mehreren Tabellen löschen
So sollte es hoffentlich klappen:
Delphi-Quellcode:
procedure TDataconnect.deleteKunde(AKunde: TKunde);
var delKuQuery: TIBOQuery; delKuTransa: TIBOTransaction; begin delKuQuery:= TIBOQuery.Create(nil); try delKuQuery.IB_Connection:=FDataBase; delKuTransa:= TIBOTransaction.Create(nil); try delKuTransa.IB_Connection:= FDataBase; try delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = :id'; delKuQuery.ParamByName('id').Value := AKunde.ID; delKuQuery.ExecSQL(); delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = :id'; delKuQuery.ParamByName('id').Value := AKunde.ID; delKuQuery.ExecSQL(); delKuTransa.Commit; except on E: Exception do begin //Fehlermeldung ausgeben oder etwas in der Art delKuTransa.Rollback; end; end; finally delKuTransa.Free; end; finally delKuQuery.Free; end; end; |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Warum denn nicht übers Constraint? Das wäre doch so viel sauberer, und genau dafür ist doch CASCADE gedacht! :(
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Woher sollen wir das denn wissen? Die Löschregel wurde mehrfach erwähnt, der TE wird schon seine Gründe haben, wieso er sie nicht definiert.
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
So ist das schon optimal, vielen,vielen Dank!!
läuft VG |
AW: Mehrere Datensätze von mehreren Tabellen löschen
So lange, bis weitere Tabellen dazu kommen, die die gleiche Spalte als Fremdschlüssel bekommen ;) Das mag im Kleinen weniger schlimm erscheinen, aber es gibt wenig nervigeres, als für sowas dann in einem mittelgroßen Projekt immer wieder an etlichen Stellen die nötigen Statements zu ergänzen. Mitnichten "optimal", finde ich. (Ich hoffe, du packst die 2 Statements wenigstens in eine Transaktion.)
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
das habe ich...
Ich verstehe deine aufregung jetzt hier auch garnicht |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Wenn Du cascade nutzt, dann liegen die notwendigen Regeln für die DB in der DB und niemand muß sich kümmern!
Deine Vorgehensweise ist schlicht schlampig und unprofessionell. (Entschuldige, aber mir hat ein Profi auch mal so eine Lösung verkauft, darüber kann ich mich noch immer aufregen) Gruß K-H |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Ich reg mich nicht auf, sondern ich durfte mal ein mittelgroßes DB-lastiges Projekt machen, mit einer DB die keine FKs kannte, und zu dem gezwungen war, wie du es gelöst hast. Es war eine kleine Hölle auf Erden, und diese Erfahrung will ich dir einfach weitergeben, in der Hoffnung, dass du dir die hereinbrechende "Maintainance-Hell" ersparen kannst. Es sei denn, du musst einen hochpreisigen Wartungsvertrag rechtfertigen, dann will ich nix gesagt haben :)
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Ja, mein ausgangspunkt ich bin ein Azubi (im ersten Lehrjahr) zum Informatikkaufmann...
Dies soll ein relativ kleines Projekt sein zum üben :) die großen Sachen muss man hier nur noch pflegen, denn die sind schon vorhanden. Vielen Dank an euch alle nochmal für die Hilfe @p80286 ich hoffe es kam jetzt auch nicht rüber als ob ich auf Profi tuh? |
AW: Mehrere Datensätze von mehreren Tabellen löschen
wg. #10
Erklär mir doch noch mal wie das funktioniert. Verstanden habe ich es so: -Sendungsverfolgung_ID ist der Primärschlüssel von Sendungsverfolgung -eingetragen werden soll hier die Kunden_ID wie funktioniert es bei diesem Schema 2 Sendungen an einen Kunden zu erstellen. |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Also die sendungsverfolgung hat dann noch einen FK zur KUnden.ID
sprich: S.K.ID |
AW: Mehrere Datensätze von mehreren Tabellen löschen
ich gebs auf ....
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Zitat:
Es geht um diesen Code (ich habe der Übersichtlichkeit mal den SQL als Parameter-Variante aufgeschrieben):
Code:
Wenn die Tabelle jetzt so definiert ist:
DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = :KundeID;
DELETE FROM Kunden WHERE Kunden_ID = :KundeID;
Code:
Müsste es nicht eher so sein:
Sendungsverfolgung:
Sendungsverfolgung_ID (Primary Key) => ID der Sendungsverfolgung Kunden_ID => Referenz zum Kunden ...
Code:
DELETE FROM Sendungsverfolgung WHERE Kunden_ID = :KundeID;
DELETE FROM Kunden WHERE Kunden_ID = :KundeID; |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Zitat:
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Zitat:
Nehmen wir zu seinen Gunsten an, daß er sich zwischen den ganzen Schlüsseln verlaufen hat. Da es nur ein Projekt zum Üben ist.... Hoffentlich gibt es einen Backup. @Impulz Wie wäre es, wenn Du uns mal die Tabellendefinition zeigst? Dann ist die Hilfe u.U. etwas einfacher. Gruß K-H |
AW: Mehrere Datensätze von mehreren Tabellen löschen
vielen Dank erstmal.
also erstmal zu dem code (um es nochmal zu erklärgen das sieht dann bei mir so aus:
Code:
das 'R' ist da entscheidend. ich meinte nicht Kunden_ID (aus der Kundentabelle) sondern den fk R.Kunden_ID (oder S kunden Id, was an dieser stelle egal ist)
DELETE FROM RECHNUNGEN R WHERE R.Kunden_ID = :id';
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
Zitat:
Darum muss das auch so funktionieren:
Code:
DELETE FROM RECHNUNGEN WHERE Kunden_ID = :id';
|
AW: Mehrere Datensätze von mehreren Tabellen löschen
grad schon, nur das ist ja nur ein auszug... das sieht so aus , dass Kunden ja Fks in 3 Tabellen haben...
diese müssen ja erst ALLE weg bevor man den kunden löscht zb Sendungsverfolgung---- Kunden Rechnung---------" Buecher----------" und desshalb nutze ich da das s., r. und b. so komme ich nicht durcheinander |
AW: Mehrere Datensätze von mehreren Tabellen löschen
Ich weiß zwar nicht, warum man hierbei durcheinander kommen kann/soll
Code:
aber da ist ja jeder in seiner eigenen Verwirrung gefangen ;)
DELETE FROM RECHNUNGEN WHERE Kunden_ID = :id;
DELETE FROM SENDUNGVERFOLGUNG WHERE Kunden_ID = :id; DELETE FROM KUNDEN WHERE ID = :id; Den SQL-Server verwirrt es auf jeden Fall schon mal gar nicht (und der braucht immer eine 100% eindeutige Referenzierung) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz