Linuchs: mySQL: „Gekoppelte“ Datensätze automatisch löschen

Moin,

ab 2001 habe ich mich auf mySQL und PHP verlagert, vorher hatte ich u.a. im Team mit Oracle auf Server und Clients gearbeitet. Es gab Bedingungen in der Datenbank, dass z.B. Kundendaten nicht gelöscht werden dürfen, solange noch Aufträge oder Rechnungen offen sind.

Ob das mit (ehemaligen) Kunden Sinn macht, sei mal dahingestellt. Aber wenn eine Veranstaltung vergangen ist und gelöscht wird, sollen alle angehängten Daten ebenfalls beerdigt werden.

mySQL habe ich damals als eingeschränktes System empfunden, es war und ist ja kostenfrei. Seitdem sitze ich allein in meiner Bastelbude und so manche Neuerung regnet an mir vorbei, ohne mich nass zu machen. Ich merke nichts davon. Gefühlt komme ich mit 10 - 20% des Sprachschatzes aus.

Beim Löschen von einem Satz termine.id sollen auch 0..n Sätze mit termin_typ.termin_id gelöscht weren.

Wie geht das?

Linuchs

  1. Hallo Linuchs,

    ab 2001 habe ich mich auf mySQL und PHP verlagert, vorher hatte ich u.a. im Team mit Oracle auf Server und Clients gearbeitet. Es gab Bedingungen in der Datenbank, dass z.B. Kundendaten nicht gelöscht werden dürfen, solange noch Aufträge oder Rechnungen offen sind.

    Beachte, dass rechnungsrelevante Daten ggfls 10 Jahre aufbewahrt werden müssen. Inwieweit das für dich gilt, musst du selber überprüfen, ich kenne deine Details nicht.

    Beim Löschen von einem Satz termine.id sollen auch 0..n Sätze mit termin_typ.termin_id gelöscht weren.

    Wie geht das?

    Ein FOREIGN KEY constraint mit ON DELETE CASCADE referential action.

    Freundliche Grüße,
    Christian Kruse

  2. Lieber Linuchs,

    Beim Löschen von einem Satz termine.id sollen auch 0..n Sätze mit termin_typ.termin_id gelöscht weren.

    Also löschst Du Termine in etwa dieser Art:

    DELETE FROM `termine`
    WHERE `termine`.`id`=:termin_id;
    

    Und jetzt musst Du "aufräumen", damit damit zusammenhängende Daten auch aus der DB verschwinden:

    DELETE FROM `termin_typ`
    WHERE NOT EXISTS (
     SELECT *
     FROM `termine`
     WHERE `termine`.`termin_typ`=`termin_typ`.`typ`
    );
    

    Keine Ahnung, wie Deine Tabellen genau aussehen, insbesondere welche Spaltennamen Du in welchen Tabellen hast. Aber Du wirst das Prinzip mit dem Sub-Select schon verstanden haben.

    Liebe Grüße

    Felix Riesterer