Advanced SQL - Einstiegstutorial 1 - Feinheiten
1. Die Abschnitte
- Vorwort
- Die Modellierung
- Die Standardtabellen
- Die Relationen von Mitgliedern
- Die Relationen von Angeboten
- Feinheiten
2. Tabellen erstellen
Sobald man eine Tabelle mit einem Fremdschlüssel auf eine andere anlegt, muss Letztere bereits vorhanden sein, sonst gibt es eine Fehlermeldung.
3. Tabellen löschen
Will man solche ins Nirwana befördern, so muss man auf Folgendes achten. Erst wird die Tabelle mit dem Fremdschlüssel gehimmelt
und danach(!) erst die, auf die der FOREIGN KEY
verweist. Ansonsten bekommt ihr auch hier einen entsprechenden Hinweis.
Ein Tipp: mit HeidiSQL geht es trotzdem. Aber wie, das findet mal schön selber
heraus.
4. Der Spaltentyp
... muss derselbe sein! Folgendes Beispiel kann daher nicht funktionieren, weil der Fremdschlüssel stufe
in der Tabelle
charakter
über einen größeren Wertebereich verfügt, als die Spalte id
in der Tabelle stufe
.
CREATE TABLE stufe
(
id TINYINT NOT NULL AUTO_INCREMENT,
...
) ENGINE=INNODB;
CREATE TABLE charakter
(
...
stufe INT,
FOREIGN KEY (stufe) REFERENCES stufe(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
) ENGINE=INNODB;
5. Der Wertebereich
... muss ebenfalls identisch sein. Im folgenden Beispiel gilt für id
in der Tabelle stufe
ein UNSIGNED
.
Allerdings wurde das in der Tabelle charakter
beim Fremdschlüssel stufe
vergessen. Die Folge? Eine Fehlermeldung.
CREATE TABLE stufe
(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
...
) ENGINE=INNODB;
CREATE TABLE charakter
(
...
stufe TINYINT,
FOREIGN KEY (stufe) REFERENCES stufe(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
) ENGINE=INNODB;
6. Ein Tipp
Nehmt euch mal den Lösungscode (rechts oben unter Daten) vor und spielt damit herum. Ändert die Reihenfolge beim Erstellen der Tabelle oder spielt mit den Spaltentypen und den Wertebereichen herum. Dann werdet ihr sehr schnell merken, auf was man so achten muss.
Ach ja
Die Sache mit dem Spaltentyp und Wertebereich läuft bidirektional ab. Man kann also nicht in der "Elterntabelle" mit einem TINYINT
und in der "Kindtabelle" mit einem SMALLINT
arbeiten. Dasselbe gilt auch für die Sache mit dem UNSIGNED
.
Andere Spaltentypen
Außer Zahlen kann man zum Beispiel auch noch VARCHAR
nehmen. Aber wer das macht, wird erschossen. Oder exmatrikuliert, je nach
Werdegang. Arbeitet bei Fremdschlüsseln nur mit Zahlen. Am Besten mit eindeutigen IDs.