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;