Grundkurs SQL

7.3.5  Domain Integrität – UNIQUE

Ein weiteres Constraint ist das UNIQUE-Constraint (englisch: einmalig). Dadurch wird sichergestellt, dass sich Werte in bestimmten Spalten bzw. Spaltenkombinationen von allen anderen Zeilen der Tabelle eindeutig unterscheiden. Allerdings sind in Abweichung zur Forderung nach Eindeutigkeit auch NULL-Werte erlaubt.

Bevor wir uns ein Beispiel ansehen, schauen wir uns die allgemeine Syntax an. Sie ist dem der Primär- bzw. Fremdschlüsselschreibweise sehr ähnlich:

CREATE TABLE tabellenName
  (
    Spalte_1 Datentyp NOT NULL,
    Spalte_2 Datentyp,
    ...,

    CONSTRAINT uniqueName UNIQUE (Spalte_2)
  )

Hier in dieser allgemeinen Schreibweise ist das UNIQUE als Tabellen-Constraint aufgeschrieben. Das UNIQUE kann aber auch als Spalten-Constraint geschrieben werden (siehe Beispiel zwei). An Hand der Ortstabelle wollen wir uns diese Einschränkung der Tabelle einmal ansehen, auch wenn es keinen Sinn macht einen Ort derart einzugrenzen, weil es Orte gibt, die verschiedene Postleitzahlen besitzen.

Hier nun die Ortstabelle als Beispiel zum besseren Verständnis:

CREATE TABLE ort
  (
    plz CHAR(5) NOT NULL DEFAULT '00000',
    ort VARCHAR (50) NOT NULL,
    vorwahl VARCHAR (12) NULL DEFAULT '000',

    CONSTRAINT primaryKey_ort PRIMARY KEY (plz),
    CONSTRAINT unique_ort UNIQUE (ort)
  ) ENGINE=INNODB

oder in Spaltenschreibweise …

CREATE TABLE ort
  (
    plz CHAR(5) NOT NULL DEFAULT '00000',
    ort VARCHAR (50) NOT NULL UNIQUE,
    vorwahl VARCHAR (12) NULL DEFAULT '000',

    CONSTRAINT primaryKey_ort PRIMARY KEY (plz)
  ) ENGINE=INNODB

Sollte sich ein Constraint auf mehr als eine Spalte beziehen, dann muss es als Tabellen-Constraint geschrieben wobei die Spalten durch Komma getrennt aufgelistet werden:

CREATE TABLE ort
  (
    ...
    CONSTRAINT unique_ort UNIQUE (ort, vorwahl)
  )

Generell ist die Eindeutigkeit (UNIQUE) verletzt, wenn es (mindestens) zwei Zeilen in der Tabelle gibt, in denen die Werte der einander entsprechenden Spalten gleich sind.