Löschen unter Bedingungen / Primary Key

Quickmaus

Benutzer
Beiträge
6
Hallo zusammen,

folgende Situation tritt bei mir auf, die ich nicht ganz verstehe:

Ich habe zwischen einer Tabelle A und einer Tabelle B eine M:N Beziehung und daraus
"ergibt" sich Tabelle C.
Tabelle C und Tabelle E haben auch eine M:N Beziehung, es ergibt sich Tabelle D.

Wenn ich nun aus Tabelle C einen Datensatz lösche, zum Beispiel mit
Code:
DELETE FROM C WHERE name = 'hans' AND number = 1;
... dann werden alle Datensätze mit Namen 'hans' auch aus Tabelle D gelöscht. number ist natürlich als Key mit in Tabelle D gewandert, wird aber nicht beachtet?

Mich wundert, dass aus Tabelle D nicht nur die Daten mit hans und number 1 gelöscht werden, sondern alle daten mit namen hans ... warum ist das so?

Vielen Dank,
Quickmaus
 
Werbung:
Hy,

soweit ich das verstehe, dürfte es hier so in deiner Datenbank eingestellt sein, dass bei diesem Constraint (zwischen Tabelle C und Tabelle D) vom DBMS zugehörige Datensätze anhand von Tabelle C in Tabelle D gelöscht werden sollen. Dies ist manchmal notwendig um Datenkonsistez zu gewährleisten.

Annahme: Daher wird anscheinend von deinem DBMS aufgrund deines "DELETE" - Stmts auf Tabelle C alle zugehörigen Datensätze aus Tabelle D gelöscht.
(Hier müssten die Beziehungen geprüft werden)

Ich bin kein Freund davon, mir wäre es lieber, wenn mir das DBMS eine Fehlermeldung zurückliefert, wenn ich einen Datensatz löschen möchte, welcher noch sogenannte Childrecords in anderen Tabellen beinhaltet.

Hoffe ich konnte dir helfen.

Lg
 
Danke für die schnellen Antworten.
Genau, ich habe ON DELETE CASCADE gesetzt ... sonst kann ich ja gar nicht löschen.

Es muss doch irgendwie möglich sein, dass nicht alle Daten zu einem "KEY" aus der Tabelle D gelöscht werden, sondern nur die, die ich explizit
in der Anweisung angebe ... WHERE x = 1 AND y = 2 ...
 
Bei CASCADE werden alle weiteren Daten gelöscht, die sich auf den Eintrag den du per DELETE löschen willst, beziehen. Das heißt es gibt einen Fremdschlüssel der sich auf deinen Datensatz bezieht. Eine Anweisung DELETE FROM tabelle WHERE x = 1 AND y = 2 wird auch nur genau die Daten löschen, die dir SELECT * FROM tabelle WHERE x = 1 AND y = 2 ausgibt. Alles andere wird entweder durch ein CASCADE, oder einen DELETE Trigger oder durch irgendeine andere Fremdeinwirkung gelöscht, nicht aber durch den ursprünglichen Befehl.
 
Zu CASCADE: Klar, aber sollten dann nicht nur die gelöscht werden (in der "verknüpften" Tabelle), die die Bedingung erfüllen...
 
view.jpg
 
Eigentlich darf Hans Nummer 2 nicht gelöscht werden, jedenfalls nicht durch:
Code:
DELETE FROM [Tabelle D] WHERE [x] = 'Hans' AND [y] = 'Nummer 1'
 
Hallo Quickmaus,

Es wird gelöscht was verknüpft ist.

In Deinem Beispiel wirst Du warscheinlich nur den Namen mit einem FK verknüpft haben.
Wenn Du einen zusammengesetzten PK aus Name und Nummer hast und dann mit einem FK darauf verweist wird nur Hans Nummer 1 gelöscht.
Wenn der PK nur aus Name besteht wird alles was Hans heist gelöscht.

Hier beide Varianten mit ON DELETE CASCADE:

In Tabelle C: Constraint PK_Name_Nummer primary key (Name, Nummer)
In Tabelle D: Constraint FK_Name_Nummer foreign key (Name, Nummer) references C (Name, Nummer)

Löscht nur Nummer 1

In Tabelle C: Constraint PK_Name primary key (Name)
In Tabelle D: Constraint FK_Name foreign key (Name) references C (Name)

Löscht auch Nummer 2

Gruß Charly
 
Werbung:
Wobei Hans nicht der PK sein kann weil er doppelt vorhanden ist.:confused:

Kannst Du mal die Create Scripts der tabellen posten?

Gruß Charly
 
Zurück
Oben