Was sind CONSTRAINTS in MySQL?

Zuletzt aktualisiert am 25. Dezember 2023 von Lars

In diesem Artikel erkläre ich euch die Grundlagen von CONSTRAINTS in MYSQL. Dazu gibt es natürlich bereits viele weitere Artikel im Netz. Beim Probieren fehlten mir aber oft einzelne entscheidende Hinweise. Vielfach wird in den Beispielen im Netz das CONSTRAINT innerhalb der CREATE TABLE-Anweisung erstellt. Existiert die Tabelle schon, oder läuft sonst was schief, hat das aber zur Folge, dass das CONSTRAINT nicht mehr angelegt wird. Ich empfehle euch daher unbedingt, das CONSTRAINT innerhalb einer ALTER TABLE Anweisung anzulegen.

Bestseller Nr. 1
Einstieg in SQL: Für alle wichtigen Datenbanksysteme: MySQL, PostgreSQL,...
Einstieg in SQL: Für alle wichtigen Datenbanksysteme: MySQL, PostgreSQL,...
Größe: ca. 7 'x5' (203 x 148 cm x, 203,2 x 147,3 cm); Material: Plüsch, 70%...
29,90 EUR Amazon Prime

Was sind CONSTRAINTS?

• CONSTRAINTS in MySQL (und anderen Datenbanken) sind Vorschriften, was in einer Tabellenspalte stehen darf.
• Häufig werden sie verwendet, um Beziehungen zwischen mehreren Tabellen zu definieren
• Jedes CONSTRAINTS muss einen eindeutigen Namen erhalten.
• Wenn CONSTRAINTS für Beziehungen zwischen mehreren Tabellen verwendet werden, dann muss das verknüpften Element entweder einen Schlüssel haben oder "UNIQUE" definiert sein.

Beispiel - Beziehungen definieren

Ich selbst bin mit der SQL-Syntax wenig vertraut. Ich klicke mir meine Datenbank in der Regel zusammen (meist in phpMySQL). Dort kann man das Ergebnis dann auch exportieren und erhält im Ergebnis die SQL-Syntax. Hier die abgespeckte, funktionierende Variante:

Schritt 1: Tabelle "name" erstellen

CREATE TABLE IF NOT EXISTS `name` (
  `adrnr` int(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
  `vorname` varchar(50) DEFAULT NULL,
  `nachname` varchar(50) DEFAULT NULL,
  `plz` varchar(4) DEFAULT NULL
) ;

Dies ist eine reduzierte Adresstabelle. Wir verwenden eine automatisch fortlaufende (AUTO_INCREMENT) Nummer als Primärschlüssel.

Schritt 2: Tabelle "plz" erstellen

CREATE TABLE IF NOT EXISTS `plz` (
  `plz` varchar(4) PRIMARY KEY NOT NULL,
  `ort` varchar(50) DEFAULT NULL
);

Schritt 3: In Tabelle "plz" plz auf UNIQUE setzen

ALTER TABLE `plz`
 ADD UNIQUE KEY `plz` (`plz`);

Damit später eine eindeutige Zuordnung möglich ist, darf es eine Postleitzahl "plz" nur einmal geben.

Schritt 4: CONSTRAINT - Verknüpfung setzen

ALTER TABLE `name`
ADD CONSTRAINT `plz_ibfk_1` FOREIGN KEY (`plz`) REFERENCES `plz` (`plz`);

Hier setzen wir unser CONSTRAINT mit Namen plz_ibfk_1 auf den Schlüssel plz.

Ergebnis / Nutzen

Nachdem wir das ganze nun entsprechend aufgesetzt haben, können wir ein paar Orte in unsere Tabelle plz eingeben.

Constraints in MySQL
CONSTRAINT in MySQL

Wenn wir jetzt Daten in unserer Namenstabelle einfügen, wird uns automatische die entsprechende Auswahl angeboten:

Constraints in MySQL
CONSTRAINT in MySQL

Durch das CONSTRAINT können wir hier also keine anderen Wert als eine PLZ aus der plz-Tabelle verwenden.

phpMyAdmin Besonderheiten

phpMyAdmin brauche ich hauptsächlich für die Sicherung und das Zurückspielen von CMS-Datenbanken. Besonders gut kenne ich mich da nicht aus. Beim Herumspielen für diesen Artikel habe ich jedoch zwei für mich neue Dinge festgestellt:

Wie löscht man Indizes in phpMyAdmin?

Indizes kannst du löschen, indem Du eine Tabelle anwählst und unter der Tabelle auf den recht unscheinbaren Link "Indizes" klickst. Dann öffnet sich eine Liste mit den Indizes und du kannst diese über die Schaltfläche "Löschen" entfernen.

Indizes löschen in phpMyAdmin
Indizes in phpMyAdmin löschen

Grafischer Beziehungseditor in phpMyAdmin

Beziehungen kann man in phpMyAdmin auch grafisch editieren. Den Editor erreichst du, indem du die Datenbank aufrufst, Abfrage wählst und den Link Designer wählst.

Grafischer Beziehungseditor in phpMyAdmin
Grafischer Beziehungseditor in phpMyAdmin
Du willst meine Arbeit unterstützen? Dann freue ich mich über eine kleine Spende!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert