Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2025/10/11 08:48] – angelegt gkoch | modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2025/10/11 09:30] (aktuell) – gkoch | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== LU08c – Fremdschlüssel direkt beim Erstellen (CREATE TABLE) ====== | ====== LU08c – Fremdschlüssel direkt beim Erstellen (CREATE TABLE) ====== | ||
- | Wir definieren drei Tabellen passend zum ERD. | + | Wir setzen das ERD in SQL um und füllen es mit europäischen Beispielen (DE/ |
- | <code sql> | + | <WRAP center box 80% round><code sql> |
- | DROP TABLE IF EXISTS | + | DROP TABLE IF EXISTS |
- | DROP TABLE IF EXISTS | + | DROP TABLE IF EXISTS |
- | DROP TABLE IF EXISTS | + | DROP TABLE IF EXISTS |
- | CREATE TABLE person | + | CREATE TABLE Continent |
- | | + | |
- | | + | |
- | | + | |
); | ); | ||
- | CREATE TABLE film ( | + | CREATE TABLE Country |
- | | + | |
- | | + | |
- | | + | |
- | director_id | + | CONSTRAINT |
- | CONSTRAINT | + | FOREIGN KEY (ContinentID) |
- | FOREIGN KEY (director_id) | + | REFERENCES |
- | REFERENCES | + | ON DELETE |
- | ON DELETE | + | |
ON UPDATE RESTRICT | ON UPDATE RESTRICT | ||
); | ); | ||
- | CREATE TABLE film_cast | + | CREATE TABLE Trip ( |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | FOREIGN KEY (film_id) | + | CONSTRAINT |
- | REFERENCES film(film_id) | + | FOREIGN KEY (CountryID) |
- | ON DELETE CASCADE | + | REFERENCES |
- | ON UPDATE CASCADE, | + | |
- | CONSTRAINT | + | |
- | FOREIGN KEY (person_id) | + | |
- | REFERENCES | + | |
ON DELETE RESTRICT | ON DELETE RESTRICT | ||
ON UPDATE RESTRICT | ON UPDATE RESTRICT | ||
); | ); | ||
- | </ | + | </code></ |
+ | |||
+ | **Warum diese Referenzaktionen? | ||
+ | * **RESTRICT** bei Country→Continent: | ||
+ | * **RESTRICT** bei Trip→Country: | ||
+ | |||
+ | ===== Beispiel-Daten (Europa) ===== | ||
+ | <WRAP center box 80% round>< | ||
+ | -- Kontinent | ||
+ | INSERT INTO Continent (ContinentName) VALUES (' | ||
+ | |||
+ | -- Länder (DE/ | ||
+ | INSERT INTO Country (CountryName, | ||
+ | SELECT x.CountryName, | ||
+ | FROM (SELECT ' | ||
+ | SELECT ' | ||
+ | SELECT ' | ||
+ | SELECT ' | ||
+ | SELECT ' | ||
+ | JOIN Continent c ON c.ContinentName=' | ||
+ | |||
+ | -- Reisen (Beispieldaten, | ||
+ | INSERT INTO Trip (CountryID, StartDate, EndDate, Price) | ||
+ | SELECT CountryID, ' | ||
+ | INSERT INTO Trip (CountryID, StartDate, EndDate, Price) | ||
+ | SELECT CountryID, ' | ||
+ | INSERT INTO Trip (CountryID, StartDate, EndDate, Price) | ||
+ | SELECT CountryID, ' | ||
+ | </ | ||
+ | |||
+ | ===== Kontroll-Selects ===== | ||
+ | <WRAP center box 80% round>< | ||
+ | SELECT ContinentID, | ||
+ | SELECT CountryID, CountryName, | ||
+ | SELECT TripID, CountryID, StartDate, EndDate, Price FROM Trip ORDER BY StartDate; | ||
+ | </ | ||
- | **Begründung der Aktionen:** | + | **Hinweis:** Die Reisedauer kann berechnet werden |
- | * **director_id → SET NULL**: Regie-Person darf verschwinden, | + | |
- | * **film_cast.film_id → CASCADE**: Wird ein Film gelöscht/ | + | |
- | * **film_cast.person_id → RESTRICT**: Eine besetzte Person kann nicht einfach gelöscht werden. | + | |