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');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);Constraint Error:NOT NULL constraint failed: students.namePrimä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');Constraint Error:Duplicate key "id: 1" violates primary key constraintCREATE 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');Constraint Error:Duplicate key "id: 1, name: Student 1" violates primary key constraintUm 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
NULLsind.
CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR, email VARCHAR UNIQUE);INSERT INTO students VALUES (1, 'Student 1', 'student1@uni.com');INSERT INTO students VALUES (2, 'Student 2', 'student1@uni.com');Constraint Error:Duplicate key "email: student1@uni.com" violates unique constraint.INSERT INTO students (id, name) VALUES (3, 'Student 3');INSERT INTO students (name, email) VALUES ('Student 3', 'student3@uni.com');Constraint Error:NOT NULL constraint failed: students.idWarnung Indizes haben bestimmte Einschränkungen, durch die Constraints zu früh ausgewertet werden können, was zu Constraint-Fehlern wie
violates primary key constraintundviolates unique constraintfü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);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);Constraint Error:Violates foreign key constraint because key "id: 2" does not exist in the referenced tableUm 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 constraintundviolates unique constraintführen kann. Weitere Details finden Sie im Abschnitt zu Indizes.