MySQL Datensatz nur löschen wenn keine Beziehungen mehr
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
auftritt
befinden
benutzer
bestehen
beziehen
beziehung
code
datenbank
datum
eintrag
ersten tabelle
grundlage
problem
statement
tabelle
tag
url
versuchen
weiteren schritte
zugreifen
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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.
-
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 -
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 -
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.
-
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage