Direkt zum Hauptinhalt springen
eLearner.app
Modul 9 · Lektion 2 von 434/57 im Kurs~12 min
Lektionen des Moduls (2/4)

Mehrere und tabellenübergreifende Constraints

Es ist von grundlegender Bedeutung, sicherzustellen, dass die Daten in der Datenbank auf der grundlegendsten Ebene („Datenintegrität“) korrekt sind. Wenn Sie nur Sicherheit in die Node.js-Anwendung schreiben, könnten Fehler zu inkonsistenten Daten in der Datenbank führen. Einschränkungen auf DDL-Ebene sind die letzte, undurchdringliche Verteidigungslinie.

Die wichtigsten Einschränkungen

Neben PRIMARY KEY (der eine Spalte eindeutig und NICHT NULL macht) und den klassischen NOT NULL und UNIQUE gibt es zwei grundlegende Kategorien für die logische Konsistenz der Daten:

1. AUSLÄNDISCHER SCHLÜSSEL (Referenzielle Integrität)

Eine REFERENCES-Einschränkung stellt sicher, dass eine Verknüpfungs-ID tatsächlich in der „übergeordneten“ Tabelle vorhanden ist, auf die sie verweist. Beispielsweise muss eine Bestellung mit einem bestehenden Kunden verknüpft sein.

SQL
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INTEGER REFERENCES customers(id)
);

Was macht der Fremdschlüssel?

  • Es verhindert, dass Sie einen customer_id einfügen, der in customers nicht vorhanden ist.
  • Es verhindert, dass Sie einen Kunden aus customers löschen, wenn Bestellungen auf ihn verweisen (es schützt vor „verwaisten“ Datensätzen).

Wir können auch entscheiden, was passieren soll, wenn das „Elternteil“ gelöscht wird:

SQL
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADE

Wenn wir mit ON DELETE CASCADE den Kunden löschen, entfernt Postgres automatisch alle verknüpften orders! (Mit großer Vorsicht verwenden; normalerweise ist die Standardeinstellung, die den Vorgang blockiert, vorzuziehen.)

2. CHECK-Einschränkungen

Eine CHECK-Einschränkung validiert die Zeile, indem sie einen booleschen Ausdruck testet, bevor mit dem Speichern fortgefahren wird.

SQL
CREATE TABLE contratti (
  id SERIAL PRIMARY KEY,
  stipendio NUMERIC(10,2) CHECK (stipendio > 0),
  data_inizio DATE,
  data_fine DATE,
  CHECK (data_fine > data_inizio)
);

Der erste CHECK ist eine Spaltenbeschränkung (er bezieht sich nur auf stipendio). Der zweite CHECK unten ist eine Tabellenbeschränkung (er kann Werte aus mehreren Spalten kreuzen und muss unten deklariert werden).

Wenn ein INSERT oder UPDATE versucht, das Ende vor dem Start zu speichern, wird Postgres dies mit einem Fehler ablehnen!

Benennungsbeschränkungen

Es empfiehlt sich oft, Einschränkungen einen expliziten Namen zu geben (mit dem Schlüsselwort CONSTRAINT). Wenn Postgres einen Datensatz blockiert, wird Ihnen auf diese Weise beispielsweise als Fehler angezeigt: „Beschränkung 'stipendio_positivo' verletzt“, was für das Debuggen viel klarer ist!

SQL
CREATE TABLE prodotti (
  id SERIAL PRIMARY KEY,
  nome VARCHAR(50),
  CONSTRAINT nome_univoco UNIQUE(nome)
);

Probieren Sie es aus

Übung#sql.m9.l2.e1
Versuche: 0Wird geladen…

Erstellen Sie eine Tabelle „prenotazioni“ mit der ID (SERIAL PRIMARY KEY) und einer „customer_id“ (INTEGER). Verwenden Sie CONSTRAINT fk_cliente FOREIGN KEY (customer_id) REFERENCES customer(id), um der Fremdschlüsseleinschränkung einen expliziten Namen zu geben. Machen Sie es unten als Tabelleneinschränkung.

Editor wird geladen…
Hinweis anzeigen

Schreiben Sie CONSTRAINT fk_cliente FOREIGN KEY (local_column) REFERENCES external_table(external_col)

Lösung nach 3 Versuchen verfügbar

Einschränkungen mit benutzerdefinierter Logik

Übung#sql.m9.l2.e2
Versuche: 0Wird geladen…

Erstellen Sie eine „eventi“-Tabelle mit der ID (SERIELLER PRIMÄRSCHLÜSSEL), posti_totali (INTEGER) und biglietti_venduti (INTEGER). Fügen Sie eine Tabelleneinschränkung mit dem Namen „check_capienza“ hinzu, wobei biglietti_venduti niemals größer als posti_totali sein darf.

Editor wird geladen…
Hinweis anzeigen

Fügen Sie die Einschränkung unten mit CONSTRAINT check_capienza CHECK (Ausdruck) hinzu.

Lösung nach 3 Versuchen verfügbar