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-Key: 95056

Url: https://administrator.de/contentid/95056

Printed on: April 16, 2024 at 20:04 o'clock

Member: SnowStar
SnowStar Aug 22, 2008 at 06:47:38 (UTC)
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!
Member: AndreasHoster
AndreasHoster Aug 22, 2008 at 07:01:55 (UTC)
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)
Member: Closed
Closed Aug 22, 2008 at 08:19:55 (UTC)
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
Member: Closed
Closed Aug 22, 2008 at 10:06:47 (UTC)
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
Member: SnowStar
SnowStar Aug 22, 2008 at 10:38:28 (UTC)
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 ...
Member: Closed
Closed Aug 22, 2008 at 14:24:44 (UTC)
Goto Top
super das funktioniert einwandfrei. denke dass dieses verfahren auch auf mehr als zwei tabellen übertragbar ist.


vielen dank
Member: SnowStar
SnowStar Aug 22, 2008 at 16:44:25 (UTC)
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
Member: Closed
Closed Aug 27, 2008 at 07:54:49 (UTC)
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?
Member: SnowStar
SnowStar Aug 27, 2008 at 10:45:21 (UTC)
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.
Member: Closed
Closed Aug 27, 2008 at 11:36:48 (UTC)
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