Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu08:theorie:d_fk-alter-table [2025/10/19 22:24] – gkoch | modul:m290_guko:learningunits:lu08:theorie:d_fk-alter-table [2025/10/27 07:23] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 2: | Zeile 2: | ||
| **Ziel:** Bereits bestehende Tabellen mit **ALTER TABLE** um Fremdschlüssel ergänzen und verstehen, was **RESTRICT**, | **Ziel:** Bereits bestehende Tabellen mit **ALTER TABLE** um Fremdschlüssel ergänzen und verstehen, was **RESTRICT**, | ||
| + | |||
| **Voraussetzung: | **Voraussetzung: | ||
| - | ===== 0) ALTER TABLE – Kurzüberblick | + | ===== 0) ALTER TABLE – Spalte in bestehende Tabelle hinzufügen |
| Mit **ALTER TABLE** können bestehende Tabellen geändert werden – also auch Fremdschlüssel hinzugefügt werden. | Mit **ALTER TABLE** können bestehende Tabellen geändert werden – also auch Fremdschlüssel hinzugefügt werden. | ||
| <WRAP box round center 80%> | <WRAP box round center 80%> | ||
| - | **Spalte hinzufügen** <code sql> | + | **Spalte hinzufügen |
| + | <code sql> | ||
| ALTER TABLE table_name | ALTER TABLE table_name | ||
| - | ADD COLUMN neue_spalte DATENTYP | + | ADD COLUMN neue_spalte DATENTYP [AFTER bestehende_spalte]; |
| + | </ | ||
| **Fremdschlüssel hinzufügen** | **Fremdschlüssel hinzufügen** | ||
| Zeile 17: | Zeile 20: | ||
| ALTER TABLE table_name | ALTER TABLE table_name | ||
| ADD CONSTRAINT fk_name | ADD CONSTRAINT fk_name | ||
| - | FOREIGN KEY (fk_spalte) | + | FOREIGN KEY (neue_spalte) |
| REFERENCES parent_table(parent_pk) | REFERENCES parent_table(parent_pk) | ||
| - | [ON DELETE | + | ON DELETE RESTRICT|CASCADE|SET NULL |
| - | [ON UPDATE | + | ON UPDATE RESTRICT|CASCADE|SET NULL; |
| </ | </ | ||
| + | </ | ||
| + | <WRAP center tip round 80%> | ||
| + | [[https:// | ||
| + | </ | ||
| - | + | ===== 1) SET NULL: Redaktor:in (editor_id) in posts ===== | |
| - | ===== 1) Beispiel: Redaktor:in (editor_id) in posts SET NULL ===== | + | |
| Wir ergänzen in **posts** eine **optionale** verantwortliche Redaktor:in (**editor_id**) und verknüpfen sie mit **users**. | Wir ergänzen in **posts** eine **optionale** verantwortliche Redaktor:in (**editor_id**) und verknüpfen sie mit **users**. | ||
| Zeile 42: | Zeile 48: | ||
| UPDATE posts SET editor_id = 2 WHERE post_id = 1; -- Post #1: Editor = martin | UPDATE posts SET editor_id = 2 WHERE post_id = 1; -- Post #1: Editor = martin | ||
| UPDATE posts SET editor_id = 1 WHERE post_id = 2; -- Post #2: Editor = caro | UPDATE posts SET editor_id = 1 WHERE post_id = 2; -- Post #2: Editor = caro | ||
| - | UPDATE posts SET editor_id = 3 WHERE post_id = 3; -- Post #3: Editor = shaolin | + | UPDATE posts SET editor_id = 4 WHERE post_id = 3; -- Post #3: Editor = shaolin |
| </ | </ | ||
| </ | </ | ||
| Zeile 59: | Zeile 65: | ||
| <WRAP tip round 80% center> | <WRAP tip round 80% center> | ||
| - | **Warum SET NULL?** Die Redaktor:in ist **optional**. Wird der zugehörige User gelöscht, soll der Post **nicht** verschwinden – der optionale Verweis fällt auf **NULL**. </ | + | **Warum SET NULL?** Die Redaktor:in ist **optional**. Wird der zugehörige User gelöscht, soll der Post **nicht** verschwinden – der optionale Verweis fällt auf **NULL**. |
| + | </ | ||
| **Test:** | **Test:** | ||
| Zeile 68: | Zeile 75: | ||
| -- Kontrolle: editor_id des betroffenen Posts ist jetzt NULL | -- Kontrolle: editor_id des betroffenen Posts ist jetzt NULL | ||
| - | SELECT post_id, title, editor_id FROM posts ORDER BY post_id; </ | + | SELECT post_id, title, editor_id FROM posts ORDER BY post_id; |
| + | </ | ||
| </ | </ | ||
| - | Absolut – nimm für **CASCADE** in *LU08d* statt der (erst später kommenden) `post_category` einfach eine kleine **Kommentare-Tabelle** als Kind von `posts`. Wenn ein Post gelöscht wird, sollen seine Kommentare automatisch mitgelöscht werden – genau dafür ist **ON DELETE CASCADE** gemacht. | ||
| - | Ersetze in *LU08d* den bisherigen CASCADE-Abschnitt durch den folgenden: | + | ===== 2) CASCADE: Kommentare zur posts (comments → posts) ===== |
| - | + | ||
| - | ===== 2) Beispiel | + | |
| Wir fügen eine Kindtabelle **comments** hinzu. Jeder Kommentar gehört zu **genau einem** Post. Wird ein Post gelöscht, sollen die zugehörigen Kommentare **automatisch verschwinden**. | Wir fügen eine Kindtabelle **comments** hinzu. Jeder Kommentar gehört zu **genau einem** Post. Wird ein Post gelöscht, sollen die zugehörigen Kommentare **automatisch verschwinden**. | ||
| Zeile 92: | Zeile 97: | ||
| ON DELETE CASCADE | ON DELETE CASCADE | ||
| ON UPDATE CASCADE | ON UPDATE CASCADE | ||
| - | ); </ | + | ); |
| + | </ | ||
| + | </ | ||
| **2.2 Kurz befüllen** | **2.2 Kurz befüllen** | ||
| - | <WRAP box round center 80%> <code sql> | + | <WRAP box round center 80%> |
| + | <code sql> | ||
| INSERT INTO comments (post_id, author, body, created_at) VALUES | INSERT INTO comments (post_id, author, body, created_at) VALUES | ||
| (2, 'Leser A', | (2, 'Leser A', | ||
| (2, ' | (2, ' | ||
| (5, ' | (5, ' | ||
| + | </ | ||
| + | </ | ||
| **2.3 Test (CASCADE in Aktion)** | **2.3 Test (CASCADE in Aktion)** | ||
| Zeile 108: | Zeile 118: | ||
| -- … die zugehörigen Kommentare sind automatisch weg: | -- … die zugehörigen Kommentare sind automatisch weg: | ||
| SELECT * FROM comments WHERE post_id = 2; -- → keine Zeilen | SELECT * FROM comments WHERE post_id = 2; -- → keine Zeilen | ||
| - | + | </ | |
| - | -- Rest bleibt unverändert: | + | </ |
| - | SELECT post_id, | + | |
| - | FROM comments | + | |
| - | ORDER BY post_id; | + | |
| <WRAP tip round 80% center> | <WRAP tip round 80% center> | ||
| Zeile 123: | Zeile 130: | ||
| ===== 3) Zusammenfassung ===== | ===== 3) Zusammenfassung ===== | ||
| - | * **RESTRICT**: | + | |
| - | * **CASCADE**: | + | * **CASCADE**: |
| - | * **SET NULL**: Kindzeile bleibt, der **optionale** Verweis wird **NULL**. | + | * **SET NULL**: Kindzeile bleibt, der **optionale** Verweis wird **NULL**. |