Zum Inhalt springen

Constraints

In SQL können Constraints für Tabellen angegeben werden. Constraints erzwingen bestimmte Eigenschaften für Daten, die in eine Tabelle eingefügt werden. Constraints können zusammen mit dem Schema der Tabelle als Teil der CREATE TABLE-Anweisung angegeben werden. In bestimmten Fällen können Constraints auch mit der ALTER TABLE-Anweisung zu einer Tabelle hinzugefügt werden; das wird derzeit jedoch nicht für alle Constraints unterstützt.

Warnung Constraints haben einen starken Einfluss auf die Leistung: Sie verlangsamen Laden und Updates, beschleunigen aber bestimmte Abfragen. Details finden Sie im Performance-Leitfaden.

Syntax

Check-Constraint

Check-Constraints erlauben einen beliebigen booleschen Ausdruck. Alle Spalten, die diesen Ausdruck nicht erfüllen, verletzen den Constraint. Beispielsweise können wir mit folgendem CHECK-Constraint erzwingen, dass die Spalte name keine Leerzeichen enthält.

CREATE TABLE students (name VARCHAR CHECK (NOT contains(name, ' ')));
INSERT INTO students VALUES ('this name contains spaces');
Terminal window
Constraint Error:
CHECK constraint failed on table students with expression CHECK((NOT contains("name", ' ')))

Not-Null-Constraint

Ein Not-Null-Constraint legt fest, dass die Spalte keine NULL-Werte enthalten darf. Standardmäßig sind alle Spalten in Tabellen nullable. Mit NOT NULL in der Spaltendefinition wird erzwungen, dass eine Spalte keine NULL-Werte enthalten darf.

CREATE TABLE students (name VARCHAR NOT NULL);
INSERT INTO students VALUES (NULL);
Terminal window
Constraint Error:
NOT NULL constraint failed: students.name

Primärschlüssel- und Unique-Constraint

Primärschlüssel- oder Unique-Constraints definieren eine Spalte oder eine Menge von Spalten, die eine Zeile in der Tabelle eindeutig identifizieren. Der Constraint erzwingt, dass die angegebenen Spalten innerhalb einer Tabelle eindeutig sind, d. h. dass höchstens eine Zeile die gegebenen Werte für diese Spaltenmenge enthält.

CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR);
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO students VALUES (1, 'Student 2');
Terminal window
Constraint Error:
Duplicate key "id: 1" violates primary key constraint
CREATE TABLE students (id INTEGER, name VARCHAR, PRIMARY KEY (id, name));
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO students VALUES (1, 'Student 2');
INSERT INTO students VALUES (1, 'Student 1');
Terminal window
Constraint Error:
Duplicate key "id: 1, name: Student 1" violates primary key constraint

Um diese Eigenschaft effizient durchzusetzen, wird für jeden Primärschlüssel- oder Unique-Constraint, der in der Tabelle definiert ist, automatisch ein ART-Index angelegt.

Primärschlüssel-Constraints und Unique-Constraints sind bis auf zwei Punkte identisch:

  • Eine Tabelle kann nur einen Primärschlüssel-Constraint haben, aber viele Unique-Constraints
  • Ein Primärschlüssel-Constraint erzwingt zusätzlich, dass die Schlüssel nicht NULL sind.
CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR, email VARCHAR UNIQUE);
INSERT INTO students VALUES (1, 'Student 1', '[email protected]');
INSERT INTO students VALUES (2, 'Student 2', '[email protected]');
Terminal window
Constraint Error:
Duplicate key "email: [email protected]" violates unique constraint.
INSERT INTO students (id, name) VALUES (3, 'Student 3');
INSERT INTO students (name, email) VALUES ('Student 3', '[email protected]');
Terminal window
Constraint Error:
NOT NULL constraint failed: students.id

Warnung Indizes haben bestimmte Einschränkungen, durch die Constraints zu früh ausgewertet werden können, was zu Constraint-Fehlern wie violates primary key constraint und violates unique constraint führen kann. Weitere Details finden Sie auf der Index-Seite.

Sie können auch einen Unique-Constraint über mehrere Spalten definieren:

CREATE TABLE integers (i INTEGER, j INTEGER, k INTEGER, UNIQUE (i, j));
INSERT INTO integers VALUES (1, 2, 3);
INSERT INTO integers VALUES (1, 4, 5);
INSERT INTO integers VALUES (1, 2, 5);
Terminal window
Constraint Error:
Duplicate key "i: 1, j: 2" violates unique constraint.

Fremdschlüssel

Fremdschlüssel definieren eine Spalte oder eine Menge von Spalten, die auf einen Primärschlüssel oder Unique-Constraint einer anderen Tabelle verweisen. Der Constraint erzwingt, dass der Schlüssel in der anderen Tabelle existiert.

CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR);
CREATE TABLE subjects (id INTEGER PRIMARY KEY, name VARCHAR);
CREATE TABLE exams (
exam_id INTEGER PRIMARY KEY,
subject_id INTEGER REFERENCES subjects(id),
student_id INTEGER REFERENCES students(id),
grade INTEGER
);
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO subjects VALUES (1, 'CS 101');
INSERT INTO exams VALUES (1, 1, 1, 10);
INSERT INTO exams VALUES (2, 1, 2, 10);
Terminal window
Constraint Error:
Violates foreign key constraint because key "id: 2" does not exist in the referenced table

Um diese Eigenschaft effizient durchzusetzen, wird für jeden Fremdschlüssel-Constraint, der in der Tabelle definiert ist, automatisch ein ART-Index angelegt.

Warnung Indizes haben bestimmte Einschränkungen, durch die Constraints zu früh ausgewertet werden können, was zu Constraint-Fehlern wie violates primary key constraint und violates unique constraint führen kann. Weitere Details finden Sie im Abschnitt zu Indizes.