closed
Goto Top

Ist das in einer SQL Query möglich

hallo,

ich habe ien datenbankstruktur, die in etwa folgende tabellen enthält: projekte, kunden, kommentare, notizen ,etc.

jetzt ist es so, dass in der tabelle projekte natürlich eine kundeid vorhanden ist, um diese zu verbinden. des weiteren ist in der tabelle kommentare natürlich auch eine zuordnung zu der tabelle notizen (unter anderem) und projekte.

jetzt möchte ich folgendes machen: wenn ein user einen kunden löscht, sollen alle projekte, die dem kunden zugeordnet wurden gelöscht werden und alle kommentare, notizen und sonstige elemente.

wie gehe ich am besten an dieses problem heran?

hoffe ich habe es einigermaßen gut beschrieben

danke schonmal

Content-ID: 95056

Url: https://administrator.de/forum/ist-das-in-einer-sql-query-moeglich-95056.html

Ausgedruckt am: 23.12.2024 um 07:12 Uhr

SnowStar
SnowStar 22.08.2008 um 08:47:38 Uhr
Goto Top
SELECT a.*, b.* FROM kunden a, projekte b WHERE (a.idkunde = kundenid) AND (b.idkunde = a.idkunde);

Sollte dir alle Spalten von a (also Tabelle kunden) und b (also Tabelle projekte) zurückgeben, die zum Kunden kundenid gehören.

Entsprechend müsste das Query fürs DELETE lauten:
DELETE a.*, b.* FROM kunden a, projekte b WHERE (a.idkunde = kundenid) AND (b.idkunde = a.idkunde);

Wobei natürlich die kundenid noch gesetzt werden muss face-wink

Ist übrigens auf MySQL bezogen, ich weiss nicht, inwiefern das auch auf MSSQL anwendbar ist!
AndreasHoster
AndreasHoster 22.08.2008 um 09:01:55 Uhr
Goto Top
Wenn Dein Datenbanksystem es unterstützt, würde ich die Tabellen gleich mit referentieller Integrität und Löschweitergabe definieren, dann kümmert sich der Server selbsttätig drum, daß in den Projekt, Notiz, Sonstwas Tabellen nur Datensätze drin sind, die zu Kunden aus der Kundentabelle gehören.

Beispiel bei einem MS SQL 2000:
ALTER TABLE [dbo].[Test1] ADD 
	CONSTRAINT [FK_Test1_Test] FOREIGN KEY 
	(
		[ID]
	) REFERENCES [dbo].[Test] (
		[ID]
	) ON DELETE CASCADE 
Legt fest, daß es in Test1.ID nur Werte geben darf die in Test.ID auch drin sind (Foreign Key) und das die Zeilen in Test1 gelöscht werden, falls der Key in Test gelöscht wird (On Delete Cascade)
Closed
Closed 22.08.2008 um 10:19:55 Uhr
Goto Top
sorry hatte vergessen zu erwähnen, dass es sich um eine mysql db handelt. werde das von snowstar dargelegte beispiel mal testen, da ich mirnicht sicher bin ob das beispiel von andreas auf einer mysql db klappt.

aber vielen dank schonmal. melde mich wenns funktioniert hatface-smile
Closed
Closed 22.08.2008 um 12:06:47 Uhr
Goto Top
hätte jetzt folgenden string:

DELETE FROM tblmeeting, tblkommentar WHERE (tblkommentar.meetingID=tblmeeting.id) AND tblmeeting.id=6;

da bekomme ich eine fehlermeldung, dass die syntax falsch sei. müsste aber eigentlich genauso sein, wie du geschrieben hast, stefan, oder?

danke schonmal
SnowStar
SnowStar 22.08.2008 um 12:38:28 Uhr
Goto Top
DELETE a.*, b.* FROM tblmeeting a, tblkommentar b WHERE (a.id = 6) AND (b.meetingID = a.id);

Du musst den Tabellen quasi "neue" Namen zuweisen (im Beispiel a und b) und die entsprechenden Felder dann mit a. und b. benennen!

Kurzum sagt das Query:
DELETE a.*, b.* FROM
// LÖSCHE VON a und b ALLES (.*)
 tblmeeting a, tblkommentar b
// a IST DIE TABELLE tblmeeting, b IST DIE TABELLE tblkommentar 
WHERE (a.id = 6) AND (b.meetingID = a.id);
// WO a.id = 6 UND b.meetingID = a.id ...
Closed
Closed 22.08.2008 um 16:24:44 Uhr
Goto Top
super das funktioniert einwandfrei. denke dass dieses verfahren auch auf mehr als zwei tabellen übertragbar ist.


vielen dank
SnowStar
SnowStar 22.08.2008 um 18:44:25 Uhr
Goto Top
DELETE a.*, b.*, c.* FROM tblmeeting a, tblkommentar b, nocheinetabelle c WHERE (a.id = 6) AND (b.meetingID = a.id) AND (c.sonstwas = a.id);

Hoffe ich face-wink
Closed
Closed 27.08.2008 um 09:54:49 Uhr
Goto Top
hi, also wie gesagt das klappt soweit ganz gut, allerdings auch NUR wenn auch kommentare zu dem erfasseten datensatz vorhanden sind bzw die WHERE Klausel halt zutrifft. ginge es auch irgendwie, dass der Datensatz von tabelle a gelöscht wird, ohne dass in Tabelle b ein Kommentar zu dem Datensatz aus Tabelle a erfasst wurde?
SnowStar
SnowStar 27.08.2008 um 12:45:21 Uhr
Goto Top
Ist vollkommen richtig.
Alternativ bleibt dir dann nur das weiter oben aufgeführte ...
ALTER TABLE [dbo].[Test1] ADD 
	CONSTRAINT [FK_Test1_Test] FOREIGN KEY 
	(
		[ID]
	) REFERENCES [dbo].[Test] (
		[ID]
	) ON DELETE CASCADE 
umgesetzt auf deine Tabellen. So löscht der MySQL dann alles, was vorhanden ist, sobald du einen Benutzer löscht.
Closed
Closed 27.08.2008 um 13:36:48 Uhr
Goto Top
habe jetzt mal eine sehr unsaubere lösung gemacht, die aber funktioniert:

abfrage auf die db und rückgabe aller datensätze in tblkommentar, die die id des zu löschenden datensatzes beinhalten von der anderen tabelle (notizen beispielsweise o.ä.)

dann abfrage der anzhal und for schleife, in der alle datensätze in der tblkommentar gelöscht werden. danach wird der eigentliche datensatz gelöscht

wie gesagt: recht unschön, aber funktioniert. danke stefan