Autor Beitrag
PC17
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Di 25.12.12 16:05 
Hallo!

Ich möchte gerne einen ganzen Datenbankeintrag löschen, mit allen unter Beziehungen.
So kann ich aus einer Tabelle die Zeile mit der id = 3 löschen, jedoch geht das in diesem Fall nicht, weil dieser Eintrag in einer Beziehung mit einer anderen Tabelle steht.
ausblenden C#-Quelltext
1:
 string strSQL = "DELETE FROM Ski WHERE id=" + 3;					


Wie kann ich jetzt alles zu diesem Eintrag löschen?

Wünsch Euch schöne Feiertage!
MfG PC17
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 25.12.12 17:46 
Du musst zuerst alle Detailsätze löschen, und zwar in der Reihenfolge ihrer Abhängigkeiten. Erst dann lässt sich auch der Hauptsatz löschen. Du kannst Dir u.U. diese Mühe sparen, wenn Du eine andere Löschregel (ON DELETE CASCADE) einstellst, aber das musst Du selbst entscheiden.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 25.12.12 17:56 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst Dir u.U. diese Mühe sparen, wenn Du eine andere Löschregel (ON DELETE CASCADE) einstellst, aber das musst Du selbst entscheiden.
Ergänzung: user profile iconWasWeißDennIch redet von Foreign Key Constraints. Muss man aber sehen, ob man das will. Ich würd's machen, aber die Punkte im Artikel sind schon nicht ganz aus der Luft gegriffen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 25.12.12 18:19 
Richtig, man muss sich seine DB-Struktur schon sehr genau anschauen und dann entscheiden, ob man wirklich kaskadierend löschen will. Wenn es ganz blöde kommt, löscht man sich sonst Datensätze, die man eigentlich lieber behalten möchte.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 02.01.13 16:06 
Hi,
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es ganz blöde kommt, löscht man sich sonst Datensätze, die man eigentlich lieber behalten möchte.

egal was man löscht, es wird immer ein Kunde kommen, der das dann doch wieder behalten wollte. Deshalb bin ich ein Freund von Deleted-Flags und echtem löschen nur in ganz seltenen Ausnahmen. Aber das ist eine andere Geschichte ;).

Gruß,
Klabautermann
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 02.01.13 17:58 
Ich muss Klabautermann Recht geben, denn gerade bei Kundendaten z.B. kann es sein, dass eben nicht alle Abhängigkeiten erfasst werden (Kunden - Aufträge - Auftragsdetails - Adresssen ...) so dass dann plötzlich Verweise ins Leere laufen. Besser ist bei Stammdaten (z.B. Kundendaten, diese nur über ein Deleteflag (Logisches Feld, belegt mit TRUE, automische Belegung beiom Anlegen mit FALSE) zu kennzeichnen. Dann kann dieser Datensatz wieder problemlos zurückgeholt werden. Detaildaten allerdings kann man eher real löschen, denn sonst würde man sich vielleicht Probleme einhandeln (z.B. nicht ausgeführte Aufträge).

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.