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.
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);Was macht der Fremdschlüssel?
- Es verhindert, dass Sie einen
customer_ideinfügen, der incustomersnicht vorhanden ist. - Es verhindert, dass Sie einen Kunden aus
customerslö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:
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADEWenn 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.
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!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);Probieren Sie es aus
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.
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
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.
Hinweis anzeigen
Fügen Sie die Einschränkung unten mit CONSTRAINT check_capienza CHECK (Ausdruck) hinzu.
Lösung nach 3 Versuchen verfügbar