SQL ON UPDATE/ON DELETE untereinander

dominic.e

Rear Admiral
Registriert
Sep. 2013
Beiträge
5.616
Hallo Liebe Gemeinde ;)
ich habe da eine kleine Frage, wo ich einfach nicht auf die Lösung komme gerade...

Und zwar ich habe als Bsp zwei Tabellen:
Tabelle Schueler:
ID
Name

Tabelle Schueler_Adressen
ID
SchuelerID (FK auf Schueler.ID)
Adresse

Jetzt mach ich bei Schueler_Adressen.SchuelerID jeweils ein ON_UPDATE und ein ON_DELETE, sodass die Adresse gelöscht wird, wenn der Schüler gelöscht wird.

Aber wie mach ich das jetzt, was mit dem Schüler passieren soll, wenn die Adresse gelöscht wird, bzw versucht wird zu löschen?
Brauch ich dann gezwungenermaßen noch eine Spalte in Schueler, welchen ich dann wieder per FK mit Schueler_Adressen verbinde, oder wie?

Sprich:
Wenn Schüler gelöscht wird --> Zugehörige Adresse mitlöschen
Wenn Adresse gelöscht wird --> Fehler, da Schüler noch existiert

Ob es so sinn ergibt, sei mal dahingestellt und auch völlig egal.
Wie "stell" ich das mit MySQL bzw PHPMyAdmin an?

Ich hoffe, es ist verständlich genug, ansonsten nochmal nachfragen. ;)

Danke schonmal =)
 
Zuletzt bearbeitet:
Wenn Schüler gelöscht wird --> Zugehörige Adresse mitlöschen

In der Reihenfolge kannst du nicht löschen, da sonst die Fremdschlüsseleinschränkung verletzt wird.

Beim Löschen eines Schülers musst du bei der gegebenen Struktur immer erst prüfen, ob es einen Adresseintrag zu diesem Schüler gibt. Wenn ja, erst Adresseintrag löschen, dann Schüler löschen.

Wenn Adresse gelöscht wird --> Zugehörigen Schüler löschen (Bzw Fehler, da Schüler noch existiert)

Das System wird dir hier keinen Fehler melden, da laut Struktur ein Schüler auch ohne Adresse existieren kann.
Du müsstest das ganze also z.B. in einem Delete-Trigger abhandeln.
Allerdings ist die Frage, was mit Schülern passiert, die die gleiche Adresse haben...
 
Die "Aufgabenstellung" lautet
- Wenn Schüler gelöscht wird, so auch die Adresse
- Wenn Adresse gelöscht wird, aber Schüler noch existiert, soll es einen Fehler geben.

Also habe ich Schueler_Adressen.SchuelerID als Fremdschlüssel auf Schueler.ID und dazu ein
ON DELETE : CASCADE
ON UPDATE : CASCADE (das mit dem On Update schnall ich noch nicht so richtig, was man da am besten nimmt)
 
dominic.e schrieb:
Aber wie mach ich das jetzt, was mit dem Schüler passieren soll, wenn die Adresse gelöscht wird, bzw versucht wird zu löschen?
Brauch ich dann gezwungenermaßen noch eine Spalte in Schueler, welchen ich dann wieder per FK mit Schueler_Adressen verbinde, oder wie?

Sprich:
Wenn Schüler gelöscht wird --> Zugehörige Adresse mitlöschen
Wenn Adresse gelöscht wird --> Fehler, da Schüler noch existiert

Das kannst du so machen, ja. Du kannst Foreign Keys auf "ON DELETE RESTRICT" stellen, das bedeutet dann, dass ein Datensatz nicht gelöscht werden kann, solange von irgendwo noch ein FK auf ihn verweist.

Die andere Frage wäre, ob man die Adressen nicht sinnvoller in der Schueler-Tabelle selbst unterbringen könnte, da es sich hier um eine 1:1-Beziehung zu handeln scheint, aber das lassen wir dann mal außen vor :)

Edit: Das ON UPDATE ist meistens egal, da in der Regel auf eine Spalte verwiesen wird, die sich ohnehin nie ändert. Setz es einfach auf CASCADE und gut ist =)
 
Einen Schüler will ich ja löschen können, sollte jedoch eine Adresse auf ihn verweisen, dann soll die Adresse ebenfalls mit gelöscht werden.

Nur wenn ich eine Adresse löschen will, welche aber noch auf einen Schüler verweist, dann will/soll ich einen Fehler bekommen.

Edit:
Um vllt etwas klarzustellen (für mich)
Wenn ich eine Tabelle habe und dort einen FK mache mit ON UPDATE und ON DELETE
dann ist es doch so gemeint, "Was passiert mit mir, wenn der refenzierte Eintrag geändert/gelöscht wird" ?

Oder ist es genau anders herum gemeint? "Was passiert mit dem Eintrag in der Elterntabelle, wenn ich gelöscht/geändert werde?"
Ergänzung ()

Ich geh hier iwann noch an die Decke :D

Ich habe hier zwei Tabellen
Tabelle schueler
- ID
- Name


Tabelle schueler_adressen
- ID
- Adresse

Die Tabellen sind bis dahin so festgelegt.

Frage:
Wie muss ich Verknüpfungen oder Trigger anlegen, sodass :
- Wenn Schüler gelöscht wird, auch die dazugehörige Adresse gelöscht wird
- Wenn Adresse gelöscht wird (bzw versucht wird), aber noch der Schüler existiert, dann soll es nicht funktionieren, bzw einen Fehler auswerfen.

Zuerst habe ich in die Tabelle schueler noch eine Spalte 'AdresseID' angelegt und diese per FK mit der Tabelle 'schueler_adressen' verknüpft.
Dann habe ich in der schueler Tabelle noch nen Trigger erstellt, welches mir NACH dem löschen des Eintrags auch den passenden Eintrag aus 'schueler_adressen' löscht, sofern vorhanden.
Bekomme aber einen Fehler geschmissen

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`edominicsql4`.`schueler`, CONSTRAINT `schueler_ibfk_1` FOREIGN KEY (`AdresseID`) REFERENCES `schueler_adressen` (`ID`) ON UPDATE CASCADE)
 
Zuletzt bearbeitet:
Zurück
Oben