Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Löschen unter Bedingungen / Primary Key

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Quickmaus, 9 Mai 2012.

  1. Quickmaus

    Quickmaus Benutzer

    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
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
  3. ukulele

    ukulele Datenbank-Guru

    http://dev.mysql.com/doc/refman/5.1/de/innodb-foreign-key-constraints.html

    Das müsste eine FOREIGN KEY Einschränkung sein (die verhindert erstmal nur das deine Daten gelöscht werden können wenn sich noch andere Daten darauf beziehen) die allerdings mit ON DELETE CASCADE angelegt wurde, was genau das ausführt was PLSQL_SQL beschrieben hat. Ich hab das allerdings auch noch nie so genutzt.
     
    PLSQL_SQL gefällt das.
  4. Quickmaus

    Quickmaus Benutzer

    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 ...
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
    PLSQL_SQL gefällt das.
  6. Quickmaus

    Quickmaus Benutzer

    Zu CASCADE: Klar, aber sollten dann nicht nur die gelöscht werden (in der "verknüpften" Tabelle), die die Bedingung erfüllen...
     
  7. Quickmaus

    Quickmaus Benutzer

    [​IMG]
     
    PLSQL_SQL gefällt das.
  8. ukulele

    ukulele Datenbank-Guru

    Eigentlich darf Hans Nummer 2 nicht gelöscht werden, jedenfalls nicht durch:
    Code:
    DELETE FROM [Tabelle D] WHERE [x] = 'Hans' AND [y] = 'Nummer 1'
     
    PLSQL_SQL gefällt das.
  9. Charly

    Charly Datenbank-Guru

    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
     
    PLSQL_SQL und Walter gefällt das.
  10. Charly

    Charly Datenbank-Guru

    Wobei Hans nicht der PK sein kann weil er doppelt vorhanden ist.:confused:

    Kannst Du mal die Create Scripts der tabellen posten?

    Gruß Charly
     
    PLSQL_SQL gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden