Advanced SQL Tutorial Zurück zur Übersicht
Über den Autor
Themen:
Relationales Datenmodell
Schlüsselfelder (und Indizes)
Erweiterte Abfragen (SELECT's mit Bedingungen)
Funktionen in Abfragen (Aggregatfunktionen)
JOIN's (Tabellen Verknüpfen)
View's (Sichten)
Zugriffsrechte (Benutzerverwaltung, Benutzerrechte)
Datenbanksysteme
Datenbankmodelle
Datenbankarchitektur
Legende:
Rot: Befehle/Parameter die im Text verwendet werden
Blau: Wichtige Hinweise zur korrekten Anwendung
Grün: Tipps zu guter Anwendung
ACHTUNG: Dieses Tutorial wird nach und nach aufgebaut also nicht wundern dass es noch so kurz ist und teilweise (noch) unlogisch.
1. Relationales Datenmodell
-
2. Schlüsselfelder
2.1 Wozu brauche ich Schlüsselfelder?
Ein Schlüssel macht jeden Datensatz (Tupel
aus einer Tabelle eindeutig identifizierbar.
Schlüssel werden dazu benutzt, Beziehungen zwischen Datenbanktabellen herstellen.
2.2 Schlüsselfeldtypen
Primärschlüssel: Macht einen Datensatz eindeutig identifizierbar. Kann pro Tabelle nur ein mal verwendet werden.
Oft ist der Primärschlüssel eine fortlaufende Nummer (oft auch "ID" genannt) da diese leichter zu verwenden & identifizieren sind.
Das Feld des Primärschlüssels darf nicht leer sein
Wird u.a. zur Vermeidung von Redundanzen eingesetzt.
Sekundärschlüssel: Hat eine Tabelle mehr als einen Schlüssel sind alle weiteren Sekundärschlüssel.
Im Gegensatz zum Primärschlüssel kann es mehere Sekundärschlüssel geben.
Die Funktion des Sekundärschlüssel ist dem des Primärschlüssels ähnlich können jedoch auch als Index über mehrere Datenfelder deklariert werden.
Er wird ebenfalls dazu verwendet Redundanzen zu vermeiden
Fremdschlüssel: Ein Fremdschlüssel stellt die Übereinstimmung eines Datenfeldes mit dem Primärschlüssel einer anderen Tabelle sicher.
2.3 Schlüsselfelder in MySQL
Bei der Unterstützung von Schlüsselfeldern gibts es Unterschiede zwischen den einzelnen Storage-Engines.
Die MySQL Standard-Engine (Unix-Systeme) MyISAM unterstützt beispielsweise Primärschlüssel, Sekundärschlüssel und Indizes aber keine Fremdschlüssel.
InnoDB, das ab MySQL 5.0 unter Windows die Standard Storage-Engine ist, unterstützt Fremdschlüssel, prüft sie jedoch nicht auf Konsistenz.
2.4 Einsatz von Schlüsselfeldern in MySQL
Beim nachträglichen Hinzufügen von Schlüsseln in eine Tabelle müssen die Bedingungen für den Schlüssel vorhanden sein: Keine Leeren Felder und keine doppelt vorhandenen Werte
2.4.1 Primärschlüssel im Einsatz
Am sinnvollsten ist es, Primärschlüssel beim anlegen einer Tabelle zu definieren.
Wenn man einem Datenfeld das Attribut AUTO_INCREMENT gibt, muss dieses der Primärschlüssel sein.
Dieses Datenfeld ist ein typisches Beispiel für eine ID.
Wie wir bereits wissen darf das Primärschlüsselfeld nicht leer sein. Also bekommt es das Attribut NOT NULL.
Primärschlüssel bei der Erstellung der Tabelle hinzufügen:
Syntax:
Code:
CREATE TABLE tableName ( fieldName dataType NOT NULL AUTO_INCREMENT, ... , PRIMARY KEY(fieldName) ;);
Beispiel:
Code:
CREATE TABLE buch (buchid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY KEY(buchid));
Ich empfehle für den Einsatz im Primärschlüsselfeld den Datentyp INTEGER in Verbindung mit AUTO_INCREMENT zu benutzen.
Dieses Datenfeld wird bei einfügen eines neuen Datensatzes automatisch hinzugefügt (man muss bzw soll es nicht selbst eingeben).
Durch das automatisierte Hochzählen werden (unter umständen sehr fatale) Eingabefehler vermieden und die Inhalte sind eindeutig.
Dadurch lässt sich beispielsweise sehr gut ein Array erstellen (Index = auto_increment - Feld).
Primärschlüssel nachträglich hinzufügen:
Zitat:
ALTER TABLE tableName ADD PRIMARY KEY (fieldName);
Primärschlüssel löschen:
Zitat:
ALTER TABLE tableName DROP PRIMARY KEY (fieldName);
2.4.2 Sekundärschlüssel im Einsatz
Bei MySQL können mehrere Sekundärschlüssel die aus jeweils mehreren Datenfeldern bestehen erstellt werden.
Wie beim Primärschlüssel ist zu beachten, dass die Schlüsselfelder nicht leer sein dürfen also NOT NULL.
Sekundärschlüssel beim Erstellen der Tabelle hinzufügen:
Syntax:
Code:
CREATE TABLE tableName ( fieldName dataType..., ... , UNIQUE secondaryKeyName(fieldName1, fieldname2, ...) ;);
Beispiel:
Code:
CREATE TABLE buch (buchid INTEGER NOT NULL AUTO_INCREMENT, buchname VARCHAR(120) NOT NULL, isbn INTEGER NOT NULL, PRIMARY KEY(buchid), UNIQUE nameundisbn(buchname, isbn));
Sekundärschlüssel nachträglich hinzufügen:
Code:
ALTER TABLE tableName ADD UNIQUE secondaryKeyName (fieldName1, fieldName2,...)
Sekundärschlüssel löschen:
Code:
ALTER TABLE tableName DROP INDEX secondaryKeyName
2.4.3 Fremdschlüssel im Einsatz
Wie bereits erwähnt unterstützen nicht alle Datenbanksysteme Fremdschlüssel.
Eigentlich existieren Fremdschlüssel in MySQL nur zur Kompatibilität mit anderen Datenbanksystemen.
Fremdschlüssel werden in MySQL deswegen nicht auf Integrität geprüft deswegen ist es nicht sonderlich sinnvoll sie produktiv einzusetzen.
Beim arbeiten mit Schlüsseln in MySQL empfehle ich InnoDB zu verwenden.
Fremdschlüssel beim erstellen der Tabelle hinzufügen:
Code:
CREATE TABLE buchautor (fs_buchid INTEGER NOT NULL, fs_autorid INTEGER NOT NULL, FOREIGN KEY (fs_buchid) REFERENCES buch (buchid), FOREIGN KEY (fs_autorid) REFERENCES autor (autorid)
Fremschlüssel nachträglich hinzufügen:
Code:
ALTER TABLE tableName ADD FOREIGN KEY (fieldName) REFEERENCES fs_tableName (fs_fieldName)
Normalerweise wird beim Einfügen eines Datensatzes in eine Tabelle mit Fremdschlüssel geprüft ob der Wert des betreffenden Feldes in der Referenztabelle des Fremdschlüssels vorhanden ist.
Falls dies nicht der Fall ist, wird eine Fehlermeldung ausgegeben
Was man bei Fremdschlüsseln beachten muss:
Wenn eine Aktion ausgeführt werden soll, die die Integrität der Daten verletzen würde, wird die Aktion normalerweise vom Datenbanksystem abgebrochen.
Ein Beispiel dafür wäre, wenn ein Datensatz in der Referenztabelle eines Fremdschlüssels gelöscht wird.
Ausnahme: Man gibt bei der Erstellung des Fremdschlüssels die Information mit, was das DB-System damit machen soll.
Die Parameter dafür lauten: ON UPDATE und ON DELETE und haben folgende Optionen:
NO ACTION: Das Ausführen wird verhindert.
SET DEFAULT: Die Datenfelder werden auf den DEFAULT - Wert zurückgesetzt (dieser musste beim erstellen des Feldes angegeben worden sein)
SET NULL: Betroffene Felder werden NULL (Leer)
CASCADE: Wird ein Datensatz in der Referenztabelle gelöscht, werden alle betroffenen Datensätze der Tabelle mit dem zutreffenden Fremdschlüssel ebenfalls gelöscht.
Wird ein Datensatz geändert, werden alle betroffenen ebenfalls geändert.
Da wir jetzt diese Optionen kennen, hier noch einmal der Befehl:
Code:
... FOREIGN KEY (fieldName) REFEERENCES fs_tableName (fs_fieldName) {ON UPDATE yourOption} {ON DELETE yourOption}
Die Parameter in den geschweiften Klammern sind optional.
BBcode Anpassung by blacksn0w, SQL highlighting von Ghostridah