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).
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
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;
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.
-- 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;