====== LU05c - Constraints (Einschränkungen) ====== ===== Lernziele ===== * Ich kann erklären, was Constraints sind und wozu sie dienen. * Ich kann PRIMARY KEY, AUTO_INCREMENT, NOT NULL und UNIQUE beim Erstellen einer Tabelle setzen. * Ich kann begründen, welcher Constraint für welche Spalte sinnvoll ist. ===== Was sind Constraints? ===== Am Ende der letzten Seite stand ein Problem: Unsere Tabelle //buch// erlaubt zwei Bücher mit derselben //buch_id// und ein Buch ganz ohne Titel. Die Datenbank prüfte so unsere Eigaben nicht – das wollen wir nun ändern. **Constraints** sind Regeln für Spalten. Sie sorgen dafür, dass fehlerhafte Daten gar nicht erst gespeichert werden können. Die Datenbank weist einen Eintrag ab, der gegen eine Regel verstösst. [[ https://www.youtube.com/watch?v=NNrkJUK_euE|Constraints kurz erklärt - 0:56min ]]((Quelle: KnowledgeBits Education/YouTube)) ===== PRIMARY KEY ===== Der Primärschlüssel identifiziert jeden Datensatz **eindeutig**. Jede Tabelle kann genau **einen** Primärschlüssel haben. CREATE TABLE buch ( buch_id INT PRIMARY KEY, titel VARCHAR(100) ); **Wirkung:** Keine zwei Bücher dürfen dieselbe //buch_id// haben. Ausserdem darf die //buch_id// nie leer (NULL) sein – ein Primärschlüssel schliesst NOT NULL automatisch mit ein. ===== AUTO_INCREMENT ===== Bisher müssten wir jede //buch_id// selbst vergeben – und dabei aufpassen, keine Nummer doppelt zu verwenden. Das übernimmt **AUTO_INCREMENT**: MySQL vergibt bei jedem neuen Datensatz automatisch die nächste freie Nummer. CREATE TABLE buch ( buch_id INT AUTO_INCREMENT PRIMARY KEY, titel VARCHAR(100) ); **Wirkung:** Das erste Buch bekommt die 1, das zweite die 2, und so weiter. Sie müssen die //buch_id// beim Einfügen gar nicht mehr angeben. AUTO_INCREMENT wird fast immer zusammen mit dem Primärschlüssel verwendet. ===== NOT NULL ===== **NOT NULL** legt fest, dass eine Spalte nicht leer bleiben darf – ein Pflichtfeld. CREATE TABLE buch ( buch_id INT AUTO_INCREMENT PRIMARY KEY, titel VARCHAR(100) NOT NULL, seiten INT ); **Wirkung:** Ein Buch ohne Titel wird abgewiesen. Ein Buch ohne Seitenzahl ist dagegen erlaubt, weil bei //seiten// kein NOT NULL steht. Fragen Sie sich bei jeder Spalte: **Ergibt ein Datensatz ohne diesen Wert überhaupt Sinn?** Wenn nein, gehört NOT NULL dorthin. ===== UNIQUE ===== **UNIQUE** verhindert, dass ein Wert in einer Spalte doppelt vorkommt. CREATE TABLE buch ( buch_id INT AUTO_INCREMENT PRIMARY KEY, titel VARCHAR(100) NOT NULL, isbn CHAR(13) UNIQUE ); **Wirkung:** Dieselbe ISBN kann nur einmal eingetragen werden. ==== Unterschied zum PRIMARY KEY ==== ^ ^ PRIMARY KEY ^ UNIQUE ^ | Wie oft pro Tabelle? | genau auf einer Spalte | bei beiligen vielen Spalten | | Darf leer sein? | nein | ja | | Zweck | identifiziert den Datensatz | verhindert Doppeleinträge | Eine ISBN wäre theoretisch auch als Primärschlüssel geeignet. In der Praxis nimmt man trotzdem meist eine eigene ID-Spalte: Sie ist kürzer, ändert sich nie und existiert auch dann, wenn ein Buch ausnahmsweise keine ISBN hat. ===== Alles zusammen ===== CREATE TABLE buch ( buch_id INT AUTO_INCREMENT PRIMARY KEY, titel VARCHAR(100) NOT NULL, isbn CHAR(13) UNIQUE, seiten INT, preis DECIMAL(6,2), erschienen DATE, ausgeliehen BOOLEAN NOT NULL ); Vergleichen Sie das mit der Fassung von der letzten Seite: Dieselbe Tabelle, aber die Datenbank passt jetzt auf, welche Daten wir eingeben. ===== Übersicht ===== ^ Constraint ^ Bedeutung ^ | PRIMARY KEY | Eindeutige Identifikation, nie leer, einmal pro Tabelle | | AUTO_INCREMENT | Automatisch fortlaufende Nummer | | NOT NULL | Spalte darf nicht leer bleiben | | UNIQUE | Wert darf in dieser Spalte nur einmal vorkommen | Es gibt einen weiteren wichtigen Constraint: den **FOREIGN KEY**, mit dem zwei Tabellen verknüpft werden. Sie haben ihn in LU04 bereits in Ihre Diagramme eingezeichnet. In SQL setzen wir ihn erst später im Modul – bis dahin bleiben unsere Tabellen einzeln. ---- {{tag>M290-LU05}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Guido Koch