====== 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;