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

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;
  • modul/m290_guko/learningunits/lu08/theorie/e_fk-abfragen.txt
  • Zuletzt geändert: 2025/10/11 09:32
  • von gkoch