====== LU08e – Referenzaktionen testen ====== Im Fachmodell sind beide FKs **RESTRICT**. Für die Didaktik zeigen wir zusätzlich *Demo-Varianten*, um **CASCADE** und **SET NULL** sichtbar zu machen (auch wenn das fachlich hier weniger Sinn ergibt). ===== 1) RESTRICT beobachten ===== Versuche, ein Land zu löschen, zu dem es Trips gibt (z. B. Italien): DELETE FROM Country WHERE CountryName='Italien'; -- sollte mit RESTRICT fehlschlagen Versuche, den Kontinent „Europa“ zu löschen: DELETE FROM Continent WHERE ContinentName='Europa'; -- sollte mit RESTRICT fehlschlagen ===== 2) Demo: CASCADE (nur zum Beobachten) ===== **Hinweis:** Nicht dauerhaft im Produktivschema verwenden — hier nur zum Verstehen der Wirkung. 1) FK von Trip→Country temporär auf **CASCADE** ändern: ALTER TABLE Trip DROP FOREIGN KEY fk_trip_country; ALTER TABLE Trip ADD CONSTRAINT fk_trip_country FOREIGN KEY (CountryID) REFERENCES Country(CountryID) ON DELETE CASCADE ON UPDATE RESTRICT; 2) Lösche nun das Land „Deutschland“: DELETE FROM Country WHERE CountryName='Deutschland'; SELECT * FROM Trip; -- zu DE gehörende Trips sind automatisch gelöscht 3) **Zurück** auf RESTRICT stellen (empfohlen): ALTER TABLE Trip DROP FOREIGN KEY fk_trip_country; ALTER TABLE Trip ADD CONSTRAINT fk_trip_country FOREIGN KEY (CountryID) REFERENCES Country(CountryID) ON DELETE RESTRICT ON UPDATE RESTRICT; ===== 3) Demo: SET NULL (nur zum Beobachten) ===== **Hinweis:** Fachlich widerspricht SET NULL hier der Regel „Trip gehört zu genau einem Land“. Wir zeigen es rein technisch. Dafür muss `Trip.CountryID` NULL erlauben: -- 1) Spalte nullbar machen ALTER TABLE Trip MODIFY CountryID INT NULL; -- 2) FK auf SET NULL ALTER TABLE Trip DROP FOREIGN KEY fk_trip_country; ALTER TABLE Trip ADD CONSTRAINT fk_trip_country FOREIGN KEY (CountryID) REFERENCES Country(CountryID) ON DELETE SET NULL ON UPDATE RESTRICT; -- 3) Land 'Schweiz' löschen -> CountryID in betroffenen Trips wird NULL DELETE FROM Country WHERE CountryName='Schweiz'; SELECT TripID, CountryID, StartDate, EndDate, Price FROM Trip; **Merke:** **SET NULL** setzt voraus, dass die FK-Spalte `NULL` erlaubt – sonst Fehler. ===== 4) Aufräumen (optional) ===== -- CountryID wieder NOT NULL + FK zurück auf RESTRICT UPDATE Trip SET CountryID = (SELECT CountryID FROM Country WHERE CountryName='Italien') WHERE CountryID IS NULL; ALTER TABLE Trip MODIFY CountryID INT NOT NULL; ALTER TABLE Trip DROP FOREIGN KEY fk_trip_country; ALTER TABLE Trip ADD CONSTRAINT fk_trip_country FOREIGN KEY (CountryID) REFERENCES Country(CountryID) ON DELETE RESTRICT ON UPDATE RESTRICT;