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;