Laden...

SQL-Abfrage, die eine Zeile löscht und automatisch alle verknüpften Zeilen aus anderen Tabellen

Erstellt von Palladin007 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.778 Views
Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Jahren
SQL-Abfrage, die eine Zeile löscht und automatisch alle verknüpften Zeilen aus anderen Tabellen

verwendetes Datenbanksystem: <Microsoft SQL Server Compact 3.5>

Moin

Ich habe eine einfache Datenbank:

Person

ID
NickName
Name
Vorname

Data

ID
PersonID
Daten

Ich habe eine 1-zu-n-Beziehung.
ID aus Person ist der Fremdschlüssel, der in Data unter PersonID eingetragen wird.

Nun will ich an der Tabelle Person eine Abfrage anhängen, die eine Zeile nach der entsprechenden ID löscht und direkt danach alle Zeilen aus der Tabelle Data, die die ID aus Person unter PersonID haben, also mit Person verknüpft sind.

Im Programmcode wäre das mit LINQ an sich kein Problem. Dann lasse ich einfach die ID als Variable speichern und mache zwei Anweisungen, die die Zeilen aus beiden Tabellen löschen.

Aber wie mache ich das als konkrete Abfrage direkt in der SQL-Datenbank?
Am besten auch noch mit Unterstützung des Abfragegenerators von Visual Studio.

Gruß

C
2.121 Beiträge seit 2010
vor 11 Jahren

an der Tabelle Person eine Abfrage anhängen

? ? ?

die eine Zeile nach der entsprechenden ID löscht und direkt danach alle Zeilen aus der Tabelle Data

Wenn du eine Fremdschlüsselbeziehung hast (du solltest das haben), muss das andersrum sein. Erst die Daten löschen, dann die Person. Sonst verweisen Daten auf eine nicht existierende Person.

Warum brauchst du da einen Generator?
Das ist zweimal DELETE FROM Tabellenname WHERE ID = Wert

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Jahren

Naja, in der Übersicht von Visual Studio ist die Tabelle so dar gestellt, dass direkt darunter die ganzen Abfragen stehen.
Das meinte ich mit "Anhängen"^^

Ich habe es bisher immer mit dem Abfragegenerator überprüft, ob die auch wirklich richtig ist, nur hat der das nie akzeptiert

C
2.121 Beiträge seit 2010
vor 11 Jahren

Du meinst also eine stored procedure? Oder eine View?
Mit einer View kannst du ein DELETE nicht realisieren.

T
2 Beiträge seit 2009
vor 11 Jahren

Mit einer View kannst du ein DELETE nicht realisieren.

Doch das geht. Falls die View "einfach" genug ist. Benutz ich jeden Tag 😉
Mit "einfach" meine ich bspw., dass die View keine Group by oder ähnliche Aggregats-Funktionen besitzt.

Zurück zum O-Post: Wie schon gesagt wurde, ist ein Foreign-Key-Constraint in der Datenbank für die verknüpften Daten Pflicht. Wenn man diesen Constraint mit "cascade on delete" konfiguriert, braucht man programmseitig nur noch die Personendaten löschen -- die abhängigen Daten löscht die Datenbank automatisch mit.

Keep it simple 😉

Torsten

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Jahren

Wenn ich ehrlich bin, weiß ich nicht einmal, was das ist.

Mein bisheriges Wissen über MsSQL und LINQ beruht auf den Inhalt dieser Seite:

http://www.codeplanet.eu/tutorials/csharp/62-datenbankanwendungen-mit-microsoft-sql-server-compact.html

Und dann noch ein paar eigene Experimente, sowie das Theorie-Wissen über Datenbanken aus der Schule.

Hier, so sieht es im Moment bei mir aus.
Die beziehung habe ich noch nicht drin, aber die kommen noch, so wie ich es beschrieben habe und natürlich ne Fremdschlüsselbeziehung:

Da sieht man auch, was ich mit "Anhängen" meine^^

Ich klicke dann einfach mit Rechts auf eine Tabelle, dann füge ich dort eie Abfrage hinzu unf geh dann weiter, bis man den Text eingeben muss.

Nur hab ich das Gefühl, dass ich von da aus nicht auf andere Tabellen zugreifen kann.

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Jahren

Mit einer View kannst du ein DELETE nicht realisieren.

Doch das geht. Falls die View "einfach" genug ist. Benutz ich jeden Tag 😉
Mit "einfach" meine ich bspw., dass die View keine Group by oder ähnliche Aggregats-Funktionen besitzt.

Zurück zum O-Post: Wie schon gesagt wurde, ist ein Foreign-Key-Constraint in der Datenbank für die verknüpften Daten Pflicht. Wenn man diesen Constraint mit "cascade on delete" konfiguriert, braucht man programmseitig nur noch die Personendaten löschen -- die abhängigen Daten löscht die Datenbank automatisch mit.

Keep it simple 😉

Torsten

Wenn du wirklich Recht hast, dann brauche ich mir da ja gar keine Gedanken mehr machen^^

Werd mal Testweise ein paar Daten eintragen und dann einen oder mehrere Accounts löschen.

C
2.121 Beiträge seit 2010
vor 11 Jahren

Ok gehen mags vielleicht, aber obs sinnvoll ist?
Man kann mit Views seine Datenbank beliebig verkomplizieren. Und bei dem einfachen Aufbau, mal angenommen es ist wirklich nicht viel komplexes, würd ich das nicht machen. Jedenfalls niemals wegen zwei DELETE.
Dem Fragesteller empfehle ich, sich mit SQL zu beschäftigen. Das ist mimt Sicherheit kein Fehler wenn man mit Daten zu tun hat.

S
18 Beiträge seit 2010
vor 11 Jahren

Hallo,

um das zu erledigen, musst du nichts spezielles tun. Dafür ist der Fremdschlüssel selbst verantwortlich. Stichwort: Referentielle Integrität. Siehe
http://msdn.microsoft.com/en-us/library/aa933119%28v=sql.80%29.aspx
oder auch https://de.wikipedia.org/wiki/Referentielle_Integrit%C3%A4t

Gruß
stupsnose