kostenloser Webspace werbefrei: lima-city


MySQL Datensatz nur löschen wenn keine Beziehungen mehr

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    hurricane3991

    hurricane3991 hat kostenlosen Webspace.

    Hi,
    tag/grundlage">Grundlage meines Problems ist eine Datenbank mit 2 Tabellen. In der einen befinden sich Benutzernamen, in der anderen weitere, sich auf diese Benutzer beziehende Daten. Diese Datensätze beinhalten jeweils den Benutzernamen, auf den sie sich beziehen, und ein Benutzer in der 1. Tabelle kann mehrere Einträge in der 2. haben. Meine Frage ist nun: Wie kann ich aus der ersten Tabelle mit einem DELETE-Statement nur jene Datensätze (Benutzer) löschen, auf die sich in der 2. Tabelle keine Datensätze mehr beziehen.

    Ich bedanke mich schon mal für eure Hilfe.

    LG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo,
    du könntest es mal mit Constraints versuchen.
    http://dev.mysql.com/doc/refman/5.1/de/innodb-foreign-key-constraints.html

    ALTER TABLE username_table 
    ADD CONSTRAINT constraint_name FOREIGN KEY (username) 
    REFERENCES 2nd_table(username) ON DELETE RESTRICT;

    Musst natürlich Tabellen- und Spaltennamen ändern.
    Weiters hab ich kA ob das unter MySQL so funktioniert.
  4. Autor dieses Themas

    hurricane3991

    hurricane3991 hat kostenlosen Webspace.

    Ja ok mit ON DELETE NO ACTION verhindere ich das zwar, aber bei jedem Versuch verstoße ich quasi gegen dieses constraint. Ich verwende die Datenbank aus Java heraus und ich gehe mal davon aus, dass mir dann jedesmal eine SQLException um die Ohren fliegt.
    Wäre also klasse wenn es eine saubere Lösung gibt, die ich häufiger aufrufen kann ohne mein Programm auf das Brechen von Regeln zu stützen :thumb:
  5. Das ist ja der Witz an der Sache. Wenn du eine SQLException bekommst (also der SQLServer die von dir gewünschte Aktion nicht zulässt) heißt das faktisch, dass sich für den betreffenden Benutzer noch Datensätze in Tabelle2 befinden. Also musst du einfach nur zuerst alle für den Benutzer relevanten Einträge aus Tabelle2 entfernen, bevor du den Benutzer selbst in Tabell1 löschst.

    Folglich heißt das, dass wenn keine Exception auftritt, das Löschen einfach möglich ist, und du keine weiteren Schritte unternehmen musst.

    mfg
  6. Autor dieses Themas

    hurricane3991

    hurricane3991 hat kostenlosen Webspace.

    Schon, aber angenommen ich möchte die Benutzer löschen, wenn sie eine bestimmte Inaktivitätszeit überschritten haben, und sie keine Daten mehr in T2 haben. Jetzt habe ich aber mit den Constraints das Problem, dass kein Eintrag in T1 gelöscht wird, falls auch nur einer noch Daten in T2 hat. Also das Ziel ist quasi, dass ich sagen kann lösche alle mit Inaktivitätszeit > 30 Tage, die auch keine Daten mehr in T2 haben, die sollen quasi einfach übersprungen werden. Aber mit den Constraints passiert halt gar nichts falls T2 nicht komplett leer ist.
  7. Wieso komplett leer?
    Der Constraint schaut ja eben ob es noch Datensätze gibt. Das sollte dann immer für jeden Eintrag extra automatisch überprüft werden.

    Würde dir empfehlen es einfach mal zu versuchen. ;)


    //Edit:
    Ansonsten könntest du auch das hier ohne Constraints versuchen:
    DELETE FROM table1 
    WHERE table1.username 
    IN (SELECT table1.username FROM table1 
    WHERE (SELECT count(*) FROM table2 WHERE table2.username = table1.username) = 0);

    Ist nicht getestet. Vlt funktionierts so ja gar nicht. :D;)

    Beitrag zuletzt geändert: 12.11.2011 8:20:40 von philippkern
  8. Autor dieses Themas

    hurricane3991

    hurricane3991 hat kostenlosen Webspace.

    Also das Problem mit den Constraints ist, dass das komplette Statement verworfen wird, wenn ein einziger Datensatz in T1 noch Beziehungen zu T2 hat, selbst wenn mehrere andere gelöscht werden könnten. Auch die bleiben in diesem Fall bestehen.

    Das Statement funktioniert nicht, sowas in der Richtung hatte ich auch schon alles probiert, aber MySQL lässt mich in dem Subselect nicht auf die Tabelle zugreifen, aus der ich grade löschen will (also T1).

    Falls es nicht möglich sein sollte ist das auch ok, dann muss ich das halt programmseitig lösen, aber das braucht halt mehrere Datenbankzugriffe, deshalb wäre es toll, wenn das der DB-Server alleine machen könnte :D
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!