Info2soft verwendet Cookies, um Ihnen ein besseres und angenehmeres Surferlebnis auf unserer Website zu ermöglichen. Datenschutzerklärung
Wird geladen...
SQL-Constraints sind Regeln, die direkt von der Datenbank-Engine durchgesetzt werden, um die Datenqualität zu sichern. Sie fungieren als Sicherheitsbarrieren auf Schema-Ebene und stellen sicher, dass jede Zeile bestimmte Kriterien erfüllt, bevor sie im Speicher abgelegt wird.
Erfahrene Entwickler setzen auf sie, da Validierungen auf Anwendungsebene niemals vollständig zuverlässig sind. Ein manuelles SQL-Skript, ein Middleware-Fehler oder eine direkte Datenbankverbindung können Ihre Anwendungslogik umgehen. Auf Datenbankebene angewendete Constraints setzen eine unumgehbare Grenze und halten Ihre zentralen Daten sauber – unabhängig davon, auf welchem Weg Daten ins System gelangen.
Sie können Constraints auf zwei Arten definieren:
CREATE TABLE, wenn die Tabelle erstmals erstellt wird.ALTER TABLE.Constraints wirken zudem in unterschiedlichen Gültigkeitsbereichen:
employee_id und project_id pro Zeile eindeutig ist.SQL-Constraints vs. Indizes
Constraints und Indizes werden oft verwechselt, erfüllen aber unterschiedliche Aufgaben. Constraints sichern die Datenintegrität, indem sie Werte prüfen oder einschränken, während Indizes die Abfrageleistung verbessern, indem sie das Auffinden von Daten beschleunigen.
Kurz gesagt: Constraints schützen die Datenqualität, Indizes optimieren den Zugriff auf Daten.
Hier ein kurzer Überblick über die gängigsten SQL-Constraints, ihre Funktion und typische Einsatzbereiche.
| Constraint | Zweck | Typischer Anwendungsfall |
|---|---|---|
| NOT NULL | Verhindert fehlende Werte | Benutzer-E-Mail, Bestelldatum |
| UNIQUE | Verhindert doppelte Werte | Benutzername, Sozialversicherungsnummer, Artikelnummer |
| PRIMARY KEY | Eindeutige Zeilenkennung | Mitarbeiter-ID, Produkt-ID |
| FOREIGN KEY | Erhält Tabellenbeziehungen | Zuordnung zu Abteilungen, Kundenbestellungen |
| CHECK | Erzwingt Wertregeln | Gehalt > 0, Alter ≥ 18 |
| DEFAULT | Legt Ersatzwerte fest | Aktivstatus, Erstellungsdatum |
Die folgenden Beispiele nutzen ein einheitliches Schema mit den Tabellen employees und departments, um die Funktionsweise jedes Constraints in einer praxisnahen Umgebung zu zeigen.
Der Constraint NOT NULL verhindert, dass eine Spalte NULL-Werte speichert – das Feld muss stets Daten enthalten. Dies ist unerlässlich für Spalten, auf die Ihre Anwendungslogik angewiesen ist, wie Kennungen, Statusfelder und Kontaktinformationen.
-- Standard-SQL
CREATE TABLE departments (
dept_id INT NOT NULL,
dept_name VARCHAR(100) NOT NULL
);
Typische Einsatzbereiche: Mitarbeiternamen, E-Mail-Adressen, Zeitstempel und Statusfelder.
Ein häufiger Fehler ist, Fremdschlüsselspalten nullable zu lassen. Dadurch können verwaiste Datensätze entstehen – Zeilen, die auf ein übergeordnetes Objekt verweisen, das nicht existiert oder nie festgelegt wurde.
Der Constraint UNIQUE stellt sicher, dass jeder Wert in einer Spalte eindeutig ist. Im Gegensatz zum Primärschlüssel kann eine Tabelle mehrere UNIQUE-Constraints besitzen – und anders als bei NOT NULL können Spalten mit UNIQUE NULL-Werte speichern (das Verhalten variiert geringfügig je nach Plattform).
-- Standard-SQL
CREATE TABLE employees (
employee_id INT NOT NULL,
email VARCHAR(255) UNIQUE,
social_security_number VARCHAR(11) CONSTRAINT unq_ssn UNIQUE
);
Sie können UNIQUE auch auf Tabellenebene anwenden, um Eindeutigkeit über eine Kombination von Spalten durchzusetzen – beispielsweise, um zu verhindern, dass derselbe Mitarbeiter mehrmals demselben Projekt zugewiesen wird:
-- Zusammengesetzter UNIQUE-Constraint
ALTER TABLE project_assignments
ADD CONSTRAINT unq_emp_project UNIQUE (employee_id, project_id);

Ein Primärschlüssel identifiziert jeden Datensatz einer Tabelle eindeutig. Er kombiniert das Verhalten von NOT NULL und UNIQUE: Die Spalte muss einen Wert enthalten, und dieser Wert muss für jede Zeile unterschiedlich sein.
Jede gut entworfene Tabelle sollte genau einen Primärschlüssel besitzen. Ohne ihn gibt es keine zuverlässige Möglichkeit, eine bestimmte Zeile zu referenzieren oder zu aktualisieren.
-- Standard-SQL
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL
);
Ein FOREIGN KEY verbindet eine Spalte einer Tabelle mit dem Primärschlüssel einer anderen Tabelle. Er sichert die referenzielle Integrität: Es ist nicht möglich, einen Wert einzufügen, der in der übergeordneten Tabelle nicht existiert, und standardmäßig können Sie eine übergeordnete Zeile nicht löschen, solange noch untergeordnete Zeilen darauf verweisen.
-- Standard-SQL
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE CASCADE
);
Zwei gängige Verhaltensweisen bei Löschvorgängen:
Wählen Sie je nach Ihrem Datenmodell aus. CASCADE ist praktisch, kann aber bei unvorsichtiger Anwendung unbeabsichtigen Datenverlust verursachen.
Der Constraint CHECK prüft Spaltenwerte anhand eines booleschen Ausdrucks. Jede Zeile, die die Bedingung nicht erfüllt, wird abgelehnt. Dadurch lassen sich Geschäftsregeln direkt auf Datenbankebene durchsetzen, statt sich auf Anwendungscode zu verlassen.
-- Standard-SQL
ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary > 0);
ALTER TABLE employees
ADD CONSTRAINT chk_hire_date CHECK (hire_date >= '2000-01-01');
CHECK-Constraints und NULL-Werte interagieren auf unerwartete Weise. Ist ein Spaltenwert NULL, ergibt der Ausdruck UNKNOWN – die Zeile wird zugelassen. Sollen NULL-Werte abgelehnt werden, kombinieren Sie CHECK mit NOT NULL.Der Constraint DEFAULT weist einen Ersatzwert zu, wenn eine INSERT-Anweisung eine Spalte auslässt. Dies vereinfacht den Anwendungscode, indem optionale Felder auf Datenbankebene verwaltet werden.
-- Standard-SQL
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
is_active BOOLEAN DEFAULT TRUE,
country VARCHAR(50) DEFAULT 'USA'
);
Nutzen Sie Standardwerte für vorhersehbare Werte wie Status-Flags oder bekannte Regionen. Vermeiden Sie Platzhalter-Daten wie '1900-01-01' oder beliebige Zahlen. Sind die Daten tatsächlich unbekannt, ist NULL die ehrlichere Wahl und verfälscht keine Auswertungen.
Datenbankschemata sind selten statisch. Mit der Weiterentwicklung Ihrer Anwendung müssen Sie vorhandene Regeln anpassen oder neue einführen, um geänderten Geschäftsanforderungen gerecht zu werden.
Der sauberste Ansatz ist die Definition von Constraints direkt in der Anweisung CREATE TABLE. Dadurch wird sichergestellt, dass von Anfang an keine ungültigen Daten ins System gelangen.
-- Standard-SQL
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
email VARCHAR(255) CONSTRAINT unq_emp_email UNIQUE,
salary DECIMAL(10, 2) CONSTRAINT chk_min_wage CHECK (salary > 0)
);
In Produktivumgebungen müssen Sie oft neue Regeln auf Tabellen anwenden, die bereits Daten enthalten. Nutzen Sie dafür den Befehl ALTER TABLE.
Wenn vorhandene Zeilen gegen die neue Regel verstoßen, lehnt die Datenbank den gesamten Vorgang ab. Daher lohnt es sich, Ihre Daten zu prüfen, bevor Sie einen Constraint auf eine Live-Tabelle anwenden.
-- Hinzufügen eines Fremdschlüssels zu einer vorhandenen Tabelle
ALTER TABLE employees
ADD CONSTRAINT fk_employee_dept
FOREIGN KEY (dept_id) REFERENCES departments(dept_id);

Wenn sich eine Geschäftsregel ändert, verwenden Sie DROP CONSTRAINT, um sie zu entfernen. Sie müssen den Constraint anhand seines genauen Namens ansprechen – ein weiterer Grund für konsistente Namenskonventionen (siehe nächster Abschnitt).
-- Standard-SQL
ALTER TABLE employees
DROP CONSTRAINT chk_min_wage;
DROP FOREIGN KEY statt DROP CONSTRAINT. DROP DATABASE geht weiter als das Entfernen einzelner Constraints oder Tabellen – es löscht die gesamte Datenbank dauerhaft. Wenn Sie dies benötigen, folgen Sie dem plattformspezifischen Leitfaden zum Löschen von Datenbanken, um häufige Fehler zu vermeiden.Einer der häufigsten Fehler von Entwicklern ist, die Datenbank-Engine automatisch Constraint-Namen generieren zu lassen. Das Ergebnis sind Bezeichnungen wie SYS_C001023 – die Ihnen in Fehlerprotokollen keinerlei Hinweise liefern.
Nutzen Sie von Anfang an eine einheitliche Namenskonvention:
pk_employees: Primärschlüssel der Tabelle employeesfk_employees_dept: Fremdschlüssel von employees nach departmentschk_employees_salary: CHECK-Constraint für die Spalte salaryunq_employees_email: UNIQUE-Constraint für die Spalte emailTritt ein Fehler vom Typ „Constraint verletzt“ in der Produktion auf, verrät ein leserlicher Name sofort, welche Regel auf welcher Tabelle gebrochen wurde – ohne Rätselraten.
Der SQL-Standard definiert das Verhalten von Constraints, doch jede Datenbank-Engine hat eigene Eigenheiten. Diese Unterschiede sind besonders relevant, wenn Sie zwischen Plattformen migrieren oder Anwendungen betreiben, die auf mehreren Datenbanksystemen laufen.
Überblick auf einen Blick:
| Merkmal | MySQL (8.0.16+) | PostgreSQL | SQL Server |
|---|---|---|---|
| CHECK-Constraints | Durchgesetzt | Durchgesetzt | Durchgesetzt |
| Mehrere NULL-Werte bei UNIQUE | Zulässig | Zulässig | Nicht zulässig |
| Aufschiebbare Constraints | Nein | Ja | Nein |
| Historische Validierung überspringen | Nein | NOT VALID | WITH NOCHECK |
| Primärschlüssel erforderlich | Ja (InnoDB) | Nein (empfohlen) | Nein (empfohlen) |
Die folgenden Abschnitte erklären jeden Unterschied detailliert.
Jahrelang akzeptierte MySQL die Syntax für CHECK-Constraints, ohne sie tatsächlich durchzusetzen. Die Engine verarbeitete die Anweisung und fuhr fort – ohne Fehler, ohne Prüfung. Das änderte sich mit Version 8.0.16 aus dem Jahr 2019, seitdem werden CHECK-Constraints ordnungsgemäß durchgesetzt.
Wenn Sie mit einer alten MySQL-Datenbank arbeiten, lohnt sich eine Überprüfung: Vor dem Upgrade eingegebene Daten erfüllen möglicherweise nicht die Regeln, die das Schema nun erzwingt.
PostgreSQL bietet die umfassendste Constraint-Unterstützung der drei Plattformen. Sein herausragendes Merkmal sind aufschiebbare Constraints, mit denen Sie einen Constraint während einer Transaktion vorübergehend aussetzen und erst bei COMMIT prüfen lassen.
Dies ist besonders praktisch für Massendatenimporte oder Vorgänge, bei denen Zeilen in einer bestimmten Reihenfolge eingefügt werden müssen, bevor die referenzielle Integrität erfüllt ist.
-- PostgreSQL: Erstellen eines aufschiebbaren Fremdschlüssels
ALTER TABLE employees
ADD CONSTRAINT fk_employee_dept
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
DEFERRABLE INITIALLY DEFERRED;
PostgreSQL unterstützt zudem NOT VALID, womit Sie einen Constraint zu einer vorhandenen Tabelle hinzufügen können, ohne vorhandene Zeilen zu prüfen – nützlich für große Produktivtabellen, bei denen ein vollständiger Tabellenscan Ausfallzeiten verursachen würde.
-- PostgreSQL: Constraint hinzufügen ohne vorhandene Zeilen zu prüfen
ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary > 0) NOT VALID;
-- Historische Zeilen separat validieren, während geringer Systemlast herrscht
ALTER TABLE employees VALIDATE CONSTRAINT chk_salary;
Eine häufige Quelle von Verwirrung beim Wechsel zwischen Plattformen ist der Umgang mit NULL-Werten in Kombination mit UNIQUE-Constraints.
Bei MySQL und PostgreSQL sind mehrere NULL-Werte in einer UNIQUE-Spalte zulässig – da NULL einen unbekannten Wert darstellt und zwei Unbekannte nicht als identisch gewertet werden. SQL Server verhält sich anders: Ein UNIQUE-Constraint erlaubt nur einen einzigen NULL-Wert. Jeder weitere NULL wird als Duplikat abgelehnt.
SQL Server unterstützt zudem WITH NOCHECK, das Gegenstück zu PostgreSQLs NOT VALID – damit lassen sich Constraints hinzufügen, ohne vorhandene Daten zu prüfen:
-- SQL Server: Constraint hinzufügen ohne vorhandene Daten zu validieren
ALTER TABLE employees
WITH NOCHECK ADD CONSTRAINT chk_salary CHECK (salary > 0);
SQL-Constraints schützen Daten innerhalb einer einzelnen Datenbankinstanz. Sie können jedoch keine Serverausfälle, Replikationsverzögerungen oder Inkonsistenzen verhindern, wenn identische Daten auf mehreren Systemen vorgehalten werden müssen.
Für Unternehmen mit verteilten Datenbanken oder Echtzeit-Analyse-Pipelines sind Regeln auf Schema-Ebene notwendig, aber nicht ausreichend. Hier kommt i2Stream ins Spiel.
i2Stream ist eine Replikationslösung für Unternehmen, die sicherstellt, dass Daten beim Transfer zwischen Systemen konsistent bleiben – egal, ob Sie auf eine Notfallwiederherstellungsumgebung replizieren, auf eine neue Plattform migrieren oder ein Data Warehouse befüllen.
i2Stream deckt die Replikationsebene ab. Für Teams mit umfassenderem Bedarf bietet Info2soft zudem i2Backup für zentralisierte Sicherungen physischer, virtueller und Cloud-Umgebungen sowie i2Availability für automatisches Failover und Hochverfügbarkeit.
SQL-Constraints definieren, wie gültige Daten aussehen. i2Stream stellt sicher, dass sie auf jedem System unverändert erhalten bleiben.
F1: Was ist der Unterschied zwischen PRIMARY KEY und UNIQUE-Constraint?
Beide sorgen für Eindeutigkeit, unterscheiden sich aber in zwei Punkten: Eine Tabelle darf nur einen Primärschlüssel besitzen, dieser erlaubt niemals NULL-Werte. Eine Tabelle kann mehrere UNIQUE-Constraints haben, und je nach Datenbank-Engine kann eine UNIQUE-Spalte einen oder mehrere NULL-Werte speichern.
F2: Beeinträchtigen Constraints die Datenbankleistung?
Ja, aber der Einfluss ist gering. Jede INSERT-, UPDATE– oder DELETE-Operation löst eine Prüfung aus, was einen kleinen Zusatzaufwand bedeutet. In der Praxis überwiegt der Vorteil, keine beschädigten Daten bereinigen zu müssen. Hinzu kommt: PRIMARY KEY und UNIQUE-Constraints erstellen automatisch Indizes, die Leseabfragen sogar beschleunigen.
F3: Wie kann ich vorhandene Constraints einer Tabelle einsehen?
In den meisten Datenbanksystemen können Sie die Ansicht information_schema.table_constraints abfragen, um alle aktiven Constraints aufzulisten. Bei SQL Server liefert der Befehl sp_help 'Tabellenname' eine detaillierte Auflistung aller auf die Tabelle angewendeten Regeln.
F4: Sollte ich Constraints verwenden, wenn meine Anwendung bereits Daten validiert?
Ja, stets. Validierungen auf Anwendungsebene verbessern die Benutzererfahrung, lassen sich aber umgehen – durch eine direkte Datenbankverbindung, ein manuelles SQL-Skript oder einen Fehler im Code. Auf Datenbankebene durchgesetzte Constraints sind die letzte Sicherheitsstufe, die Ihre Daten schützt, unabhängig davon, auf welchem Weg sie ins System gelangen.
F5: Kann ich einen NOT NULL-Constraint zu einer Spalte hinzufügen, die bereits Daten enthält?
Ja, aber nur, wenn die Spalte keine NULL-Werte enthält. Sind noch NULL-Einträge vorhanden, schlägt der Befehl ALTER TABLE fehl. Zuerst müssen Sie alle NULL-Einträge mit gültigen Werten überschreiben mithilfe von UPDATE, bevor der Constraint angewendet werden kann.
SQL-Constraints zählen zu den am wenigsten genutzten Werkzeugen im Datenbankdesign. Bei korrekter Anwendung erkennen sie fehlerhafte Daten, bevor diese ins System gelangen – das spart Aufräumarbeiten und verhindert schwer nachvollziehbare stille Fehler.
Die sechs vorgestellten Constraint-Typen erfüllen jeweils eine eigene Aufgabe: Von der Pflichtfeldprüfung mit NOT NULL bis zur Sicherung von Tabellenbeziehungen mit FOREIGN KEY. Die zentralen Gewohnheiten sind einfach: Benennen Sie alle Constraints, prüfen Sie vorhandene Daten vor dem Anwenden von Regeln auf Live-Tabellen und machen Sie sich mit den Eigenheiten Ihrer Datenbank-Engine bei Randfällen wie NULL-Werten und der Durchsetzung von CHECK vertraut.
Constraints schützen Daten innerhalb einer einzelnen Instanz. Für Teams, die Daten über mehrere Systeme und Umgebungen verwalten, sorgt die Kombination mit einer Replikations- und Sicherungsstrategie für eine durchgängige Absicherung. Info2soft bietet eine vollständige Produktpalette für Datenschutz, Replikation und Migration – ausgelegt für Unternehmensumgebungen, in denen Datenintegrität nicht kompromittiert werden darf.