SQL Constraints

Hier lernen Sie

  • was Constraints sind,
  • wie man diese definiert.

1. Was sind Constrains?

Constraints sind Regeln, welche Sie definieren können und die vom Datenbankmanagementsystem überprüft werden sollen.

Beispiel: Es soll eine Adressverwaltung erstellt werden. Dazu sollen in einer Tabelle der Vor-und Nachname, das Geschlecht, die Straße, die Postleitzahl und der Ort gespeichert werden:

create table adresse(

  name varchar(50),

  vorname varchar(50),

  geschlecht char(1),

  strasse varchar(50),

  postleitzahl dec(5),

  ort varchar(50)

);

Die Postleitzahl ist als 5-Stellige Ziffer (dec(5)) definiert. Damit ist das Einfügen einiger fehlerhafter Datensätze bereits ausgeschlossen. Die nicht sinnvolle Postleitzahl "23xy3" kann beispielsweise nicht eingefügt werden (passt vom Datentyp her nicht, siehe auch Wertebereichsintegrität).

Allerdings ist es möglich eine negative Zahl für die Postleitzahl zu vergeben, welches aber ebenfalls kein sinnvoller Wert ist.

2. Wertebereiche mit check-Constraints überprüfen

Es ist also sinnvoll die Wertebereiche bestimmter Datenfelder einzuschränken. Dazu definieren wir eine Regel, dass Postleitzahlen positiv sein sollen:

create table adresse(

  name varchar(50),

  vorname varchar(50),

  geschlecht char(1),

  strasse varchar(50),

  postleitzahl dec(5) check (postleitzahl>0),

  ort varchar(50),

  land varchar(50)

);

Wollen wir, dass eine Postleitzahl genau 5 Stellen hat, d.h. größer gleich 10000 und kleiner gleich 99999 ist, ändert man die obige Zeile wie folgt:

postleitzahl dec(5) check (postleitzahl>=10000 and postleitzahl<=99999),

oder

postleitzahl dec(5) check (postleitzahl between 10000 and 99999),

Sollen für das Geschlecht nur die Werte 'm' und 'w' erlaubt werden, wird obige Tabelle wie folgt geändert:

geschlecht char(1) check (geschlecht='m' or geschlecht='w'),

Sollen für das Land nur "Deutschland", "Schweiz" und "Frankreich" erlaubt werden, geht das z.B. mit dem IN-Operator:

land varchar(50) CHECK (land IN ('Deutschland','Schweiz','Frankreich')), 

country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),    - See more at: http://www.w3resource.com/mysql/creating-table-advance/constraint.php#sthash.FkyPfZ76.dpuf
country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),    - See more at: http://www.w3resource.com/mysql/creating-table-advance/constraint.php#sthash.FkyPfZ76.dpuf
country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),    - See more at: http://www.w3resource.com/mysql/creating-table-advance/constraint.php#sthash.FkyPfZ76.dpuf
country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),    - See more at: http://www.w3resource.com/mysql/creating-table-advance/constraint.php#sthash.FkyPfZ76.dpuf

3. weitere Möglichkeiten, um Constraints zu definieren

Constraints müssen nicht direkt hinter dem Datenfeld stehen, sondern können "später" definiert werden:

create table adresse(

  name varchar(50),

  vorname varchar(50),

  geschlecht char(1),

  strasse varchar(50),

  postleitzahl dec(5),

  ort varchar(50),

  land varchar(50),

  CONSTRAINT postleitzahl CHECK (postleitzahl between 10000 AND 99999)

);

Constraints können auch nachträglich in eine bestehende Tabelle eingegeben werden. Bestehende Tabellen ändert man mit alter (siehe dazu auch):

alter table adresse ADD CONSTRAINT postleitzahl CHECK (postleitzahl between 10000 AND 99999);

Beachten Sie:

  • MySQL kann mit den obigen Beispiele zwar zumgehen, ignoriert diese aber in der aktuellen Version. Sie können also trotz CONSTRAINT postleitzahl CHECK (postleitzahl between 10000 AND 99999) dem widersprechende Werte in die Tabelle einfügen. Um Constraints wirklich zu testen, empfehlen sich daher andere SQL-Programme (z.B. PostgresQL). 
  • weitere Contraints sind auto_increment und primary key, zum Festzulegen, dass ein Wert automatisch erhöht wird bzw. welcher Wert ein Primärschlüsssel ist (siehe dazu "Tabellen erstellen").
  • Auch das Verknüpfen von Primar- mit Fremdschlüsseln ist ein wichtiger Anwendungsfall von Constraints.
country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),    - See more at: http://www.w3resource.com/mysql/creating-table-advance/constraint.php#sthash.FkyPfZ76.dpuf