Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
de:modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2026/10/17 14:03] – gkochde:modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2026/10/17 16:40] (aktuell) – gkoch
Zeile 3: Zeile 3:
 ===== Lernziele ===== ===== Lernziele =====
   * Ich kann mit ALTER TABLE eine Spalte und einen Fremdschlüssel zu einer bestehenden Tabelle hinzufügen.   * Ich kann mit ALTER TABLE eine Spalte und einen Fremdschlüssel zu einer bestehenden Tabelle hinzufügen.
-  * Ich kann die Referenzaktionen RESTRICT, CASCADE und SET NULL erklären. +  * Ich kann erklären, was RESTRICT, CASCADE und SET NULL beim Löschen bewirken. 
-  * Ich kann für eine Beziehung begründen, welche Referenzaktion sinnvoll ist.+  * Ich kann für eine Beziehung begründen, welche Referenzaktion passt.
  
  
-===== Ausgangslage =====+===== Wozu nachträglich? ===== 
 +Eine Datenbank entsteht selten in einem Zug. Oft gibt es die Tabellen schon, samt Daten, und dann kommt eine neue Spalte oder eine neue Verknüpfung dazu.
  
-<WRAP center round important 80%> +Bei Ihren Cases aus LU05 ist das genau so. Dort haben Sie die Spalten für die Fremdschlüssel angelegt, aber noch nicht als Fremdschlüssel gesetzt. Das holen Sie mit **ALTER TABLE** nach.
-Führen Sie zuerst das **Setup-Skript** (//travel_blog_setup.sql//, in Moodle) aus. Damit hat Ihre Datenbank genau den Stand, von dem diese Seite ausgeht: Caro hat die //user_id// 1, Martin die 2, Shaolin die 3. +
-</WRAP>+
  
-In der Praxis entsteht eine Datenbank selten in einem Zug. Oft existieren Tabellen schon mit Daten – und es kommt eine neue Spalte oder eine neue Verknüpfung dazu. Genau so ist es bei Ihren Cases aus LU05: Dort haben Sie die Fremdschlüssel-Spalten angelegt, aber noch nicht als Fremdschlüssel gesetzt. Das holen Sie mit **ALTER TABLE** nach.+Wir bleiben beim Reiseblog der letzten Seite. Zur Erinnerung: Caro hat die //user_id// 1, Martin die 2, Shaolin die 3.
  
  
 ===== ALTER TABLE ===== ===== ALTER TABLE =====
 +Zuerst kommt die neue Spalte in die bestehende Tabelle:
  
-**Spalte zu einer bestehenden Tabelle hinzufügen:** 
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
-ALTER TABLE tabellenname+ALTER TABLE kind_tabelle
 ADD COLUMN neue_spalte DATENTYP; ADD COLUMN neue_spalte DATENTYP;
 </code></WRAP> </code></WRAP>
  
-**Fremdschlüssel nachträglich setzen:**+Danach wird genau diese Spalte zum Fremdschlüssel: 
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
 ALTER TABLE kind_tabelle ALTER TABLE kind_tabelle
 ADD CONSTRAINT fk_name ADD CONSTRAINT fk_name
-FOREIGN KEY (fremdschluessel)+FOREIGN KEY (neue_spalte)
 REFERENCES eltern_tabelle (primaerschluessel) REFERENCES eltern_tabelle (primaerschluessel)
 ON DELETE referenzaktion; ON DELETE referenzaktion;
 </code></WRAP> </code></WRAP>
  
-//fk_name// ist ein frei wählbarer Name für die Regel, z.B. //fk_posts_editor//. So erkennen Sie in Fehlermeldungen sofort, welche Regel gegriffen hat.+Den //fk_name// wählen Sie selbst, zum Beispiel //fk_posts_editor//. So erkennt man bei Fehlermeldungen, welcher Constraint sich hier bemerkbar macht.
  
  
 ===== Die drei Referenzaktionen ===== ===== Die drei Referenzaktionen =====
-Mit ''ON DELETE'' legen Sie fest, was passiert, wenn eine **Elternzeile gelöscht** wird, auf die noch Kindzeilen verweisen:+Mit ''ON DELETE'' legen Sie fest, was mit den Kindzeilen passiert, wenn ihre Elternzeile gelöscht wird.
  
 <WRAP center box 80% round> <WRAP center box 80% round>
-^ Referenzaktion ^ Was passiert mit den Kindzeilen? ^ Typisches Beispiel ^ +^ Referenzaktion ^ Was passiert mit den Kindzeilen? ^ Beispiel ^ 
-| **RESTRICT** | Nichts – das Löschen wird **verhindert** | Ein Autor mit Posts darf nicht gelöscht werden | +| **RESTRICT** | Nichts. Das Löschen der Elternzeile wird verhindert. | Eine Autorin mit Posts kann nicht gelöscht werden | 
-| **CASCADE** | Sie werden **mitgelöscht** | Wird ein Post gelöscht, verschwinden seine Kommentare | +| **CASCADE** | Sie werden mitgelöscht. | Wird ein Post gelöscht, verschwinden seine Kommentare | 
-| **SET NULL** | Sie bleiben, der Verweis wird **leer** (NULL) | Eine optionale Redaktorin wird gelöscht, der Post bleibt |+| **SET NULL** | Sie bleiben, der Verweis wird leer (NULL). | Eine Redaktorin wird gelöscht, ihre Posts bleiben |
 </WRAP> </WRAP>
 +
 +Ohne Angabe gilt **RESTRICT**. Das haben wir auf der letzten Seite gesehen, als sich Martin nicht löschen liess.
  
 <WRAP center round info 80%> <WRAP center round info 80%>
-Wird keine Referenzaktion angegeben, gilt **RESTRICT** – das haben Sie in LU08b erlebt. (Genau genommen heisst der Standard in MySQL //NO ACTION//, verhält sich aber identisch.)\\ +In MySQL heisst der Standard genau genommen //NO ACTION//. Er verhält sich gleich wie RESTRICT.\\ 
-Neben ''ON DELETE'' gibt es auch ''ON UPDATE'' für das Ändern eines Primärschlüssels. Da Primärschlüssel in der Regel nie geändert werden, lassen wir das weg – es gilt dann ebenfalls RESTRICT.+Neben ''ON DELETE'' gibt es auch ''ON UPDATE'', das beim Ändern eines Primärschlüssels greift. Primärschlüssel werden in der Regel nie geändert, deshalb lassen wir es weg. Es gilt dann ebenfalls RESTRICT.
 </WRAP> </WRAP>
  
-**Die Leitfrage für die Wahl:** //Ergibt die Kindzeile ohne ihre Elternzeile noch Sinn?//+Für die Wahl hilft eine Frage: **Ergibt die Kindzeile ohne ihre Elternzeile noch Sinn?**
  
-  * Nein, sie wäre nutzlos → **CASCADE** +  * Nein, sie wäre nutzlos. Dann passt **CASCADE**. 
-  * Ja, der Verweis ist nur eine Zusatzinformation → **SET NULL** +  * Ja, der Verweis ist nur eine Zusatzinformation. Dann passt **SET NULL**. 
-  * Das Löschen soll gar nicht erst möglich sein → **RESTRICT**+  * Die Elternzeile soll gar nicht gelöscht werden können, solange Kindzeilen existieren. Dann bleibt es bei **RESTRICT**.
  
  
 ===== Beispiel 1: SET NULL ===== ===== Beispiel 1: SET NULL =====
-Jeder Post bekommt neu eine **optionale** Redaktorin (//editor_id//), die den Text gegenliest. Wird diese Person gelöscht, soll der Post erhalten bleiben – nur der Verweis fällt weg.+Jeder Post bekommt eine Redaktorin, die den Text gegenliest (//editor_id//). Das ist freiwillig. Wird diese Person gelöscht, soll der Post bleiben. Nur der Verweis fällt weg.
  
 **Spalte ergänzen und befüllen:** **Spalte ergänzen und befüllen:**
Zeile 71: Zeile 73:
 </code></WRAP> </code></WRAP>
  
-Beachten Sie das ''NULL'' bei der Spalte: Ohne das wäre SET NULL gar nicht möglich, weil die Spalte keine leeren Werte erlauben würde.+Wichtig ist das ''NULL'' bei der Spalte. Ohne dieses dürfte die Spalte nie leer sein, und SET NULL könnte nicht funktionieren.
  
 **Fremdschlüssel setzen:** **Fremdschlüssel setzen:**
Zeile 89: Zeile 91:
 </code></WRAP> </code></WRAP>
  
-**Ergebnis:** Shaolin ist gelöscht, der Lissabon-Post existiert weiterhin – seine //editor_id// ist jetzt NULL.+Shaolin ist gelöscht. Den Lissabon-Post gibt es weiterhin, seine //editor_id// ist jetzt NULL.
  
 <WRAP center round tip 80%> <WRAP center round tip 80%>
-**Warum durfte Shaolin hier gelöscht werden?** Shaolin ist bei keinem Post als **Autor** eingetragen. Der Fremdschlüssel //author_id// mit RESTRICT greift also nicht. Versuchen Sie dasselbe mit Martin: Das scheitert weiterhin – nicht wegen //editor_id//, sondern wegen //author_id//.+Shaolin liess sich löschen, weil er bei keinem Post **Autor** ist. Der Fremdschlüssel //author_id// blockiert also nichts. Bei Martin sieht das anders aus: Er ist Autor von drei Posts, und //author_id// steht weiterhin auf RESTRICT. Martin lässt sich deshalb immer noch nicht löschen.
 </WRAP> </WRAP>
  
  
 ===== Beispiel 2: CASCADE ===== ===== Beispiel 2: CASCADE =====
-Wir ergänzen eine Tabelle //comments//. Jeder Kommentar gehört zu genau einem Post. Ein Kommentar ohne Post ist nutzlos – wird der Post gelöscht, sollen seine Kommentare automatisch mit verschwinden.+Jetzt kommen Kommentare dazu. Jeder Kommentar gehört zu genau einem Post. Ohne seinen Post ergibt ein Kommentar keinen Sinn. Wird der Post gelöscht, sollen seine Kommentare deshalb automatisch mitgehen.
  
 **Tabelle anlegen:** **Tabelle anlegen:**
Zeile 112: Zeile 114:
 </code></WRAP> </code></WRAP>
  
-Hier steht der Fremdschlüssel direkt im CREATE TABLE, wie in LU08b – Referenzaktionen funktionieren auf beiden Wegen.+Hier steht der Fremdschlüssel direkt im CREATE TABLE, wie auf der letzten Seite. Eine Referenzaktion lässt sich auf beiden Wegen angeben.
  
 **Befüllen:** **Befüllen:**
Zeile 129: Zeile 131:
 </code></WRAP> </code></WRAP>
  
-**Ergebnis:** Der Utrecht-Post ist gelöscht – und mit ihm beide Kommentare. Übrig bleibt nur der Kommentar zum Montenegro-Post.+Der Utrecht-Post ist weg, und mit ihm seine beiden Kommentare. Übrig bleibt nur der Kommentar zum Montenegro-Post.
  
 <WRAP center round important 80%> <WRAP center round important 80%>
-CASCADE ist praktisch, aber mächtig: Ein einziger DELETE kann viele Zeilen in anderen Tabellen mitlöschen. Setzen Sie es nur dort ein, wo die Kindzeilen ohne ihre Elternzeile wirklich keinen Sinn mehr haben.+CASCADE ist bequem, aber mit Vorsicht zu geniessen. Ein einziger DELETE kann so viele Zeilen in anderen Tabellen mitlöschen. Verwenden Sie es nur dort, wo die Kindzeilen ohne Elternzeile wirklich nutzlos sind.
 </WRAP> </WRAP>
  
Zeile 140: Zeile 142:
 <WRAP center box 80% round> <WRAP center box 80% round>
 ^ Referenzaktion ^ Wann einsetzen? ^ ^ Referenzaktion ^ Wann einsetzen? ^
-| RESTRICT | Standard. Wenn das Löschen der Elternzeile verhindert werden soll. | +| RESTRICT | Standard. Die Elternzeile soll nicht gelöscht werden, solange Kindzeilen darauf verweisen. | 
-| CASCADE | Wenn die Kindzeilen ohne Elternzeile nutzlos sind (Kommentare, Zwischentabellen). | +| CASCADE | Die Kindzeilen sind ohne Elternzeile nutzlos, zum Beispiel Kommentare. | 
-| SET NULL | Wenn der Verweis optional ist und die Kindzeile bestehen bleiben soll. |+| SET NULL | Der Verweis ist freiwillig und die Kindzeile soll bleiben. |
 </WRAP> </WRAP>
  
Zeile 148: Zeile 150:
 {{youtube>aaO2cUhN9zA?}}\\ {{youtube>aaO2cUhN9zA?}}\\
 //ON DELETE: NO ACTION, SET NULL, CASCADE, SET DEFAULT (9:22 min, deutsch). Quelle: Prof. Dr. Jens Dittrich / YouTube\\ //ON DELETE: NO ACTION, SET NULL, CASCADE, SET DEFAULT (9:22 min, deutsch). Quelle: Prof. Dr. Jens Dittrich / YouTube\\
-Das Video zeigt zusätzlich SET DEFAULT – diese Option brauchen wir im Modul nicht.//+Das Video zeigt zusätzlich SET DEFAULT. Diese Option brauchen wir im Modul nicht.//
 </WRAP> </WRAP>
  
  • de/modul/m290_guko/learningunits/lu08/theorie/c_fk-create-table.txt
  • Zuletzt geändert: 2026/10/17 16:40
  • von gkoch