Lekcje modułu (2/4)
Wielokrotne ograniczenia i ograniczenia na poziomie tabeli
Zapewnienie poprawności danych w bazie danych w najbardziej podstawowej warstwie („integralność danych”) ma fundamentalne znaczenie. Jeśli do aplikacji Node.js napiszesz tylko bezpieczeństwo, błędy mogą spowodować niespójność danych w bazie danych. Ograniczenia na poziomie DDL są ostatnią, nieprzeniknioną linią obrony.
Główne ograniczenia
Oprócz PRIMARY KEY (który sprawia, że kolumna jest unikalna i NIE NULL) oraz klasycznych NOT NULL i UNIQUE, istnieją dwie podstawowe kategorie logicznej spójności danych:
1. KLUCZ OBCY (Integralność referencyjna)
Ograniczenie REFERENCES gwarantuje, że identyfikator połączenia rzeczywiście istnieje w tabeli „nadrzędnej”, na którą wskazuje.
Na przykład zamówienie musi być powiązane z istniejącym klientem.
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);Do czego służy klucz obcy?
- Uniemożliwia wstawienie
customer_id, który nie istnieje wcustomers. - Uniemożliwia
DELETE(usunięcie) klienta zcustomers, jeśli istnieją zamówienia na niego wskazujące (chroni to przed rekordami „osieroconymi”).
Możemy również zdecydować, co powinno się stać, gdy „rodzic” zostanie usunięty:
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADEW przypadku ON DELETE CASCADE, jeśli usuniemy klienta, Postgres automatycznie usunie wszystkie powiązane orders! (Używaj z dużą ostrożnością; zwykle preferowane jest ustawienie domyślne, które blokuje operację.)
2. SPRAWDŹ Ograniczenia
Ograniczenie CHECK sprawdza poprawność wiersza, testując wyrażenie logiczne przed przystąpieniem do zapisywania.
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)
);Pierwsze CHECK jest ograniczeniem kolumny (odnosi się tylko do stipendio).
Drugie CHECK na dole to ograniczenie tabeli (może krzyżować wartości z wielu kolumn i musi być zadeklarowane na dole).
Jeśli INSERT lub UPDATE spróbuje zapisać koniec przed początkiem, Postgres odrzuci to z błędem!
Ograniczenia nazewnictwa
Często dobrą praktyką jest nadawanie warunkom wyraźnej nazwy (za pomocą słowa kluczowego CONSTRAINT). W ten sposób, gdy Postgres zablokuje rekord, błąd poinformuje Cię na przykład o „naruszeniu ograniczenia „stipendio_positivo”, co jest znacznie wyraźniejsze podczas debugowania!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);Spróbuj
Utwórz tabelę „prenotazioni” z identyfikatorem (SERIAL PRIMARY KEY) i „customer_id” (INTEGER). Użyj CONSTRAINT fk_cliente FOREIGN KEY (customer_id) REFERENCES klienci(id), aby nadać wyraźną nazwę ograniczeniu klucza obcego. Zrób to na dole, jako ograniczenie tabeli.
Pokaż wskazówkę
Napisz CONSTRAINT fk_cliente KLUCZ OBCY (kolumna_lokalna) REFERENCJE tabela_zewnętrzna(kolumna_zewnętrzna)
Rozwiązanie dostępne po 3 próbach
Ograniczenia z logiką niestandardową
Utwórz tabelę „eventi” z identyfikatorem (SERIAL PRIMARY KEY), posti_totali (INTEGER) i biglietti_venduti (INTEGER). Dodaj ograniczenie tabeli o nazwie „check_capienza”, gdzie biglietti_venduti nie może nigdy być większe niż posti_totali.
Pokaż wskazówkę
Dodaj ograniczenie na dole za pomocą CONSTRAINT check_capienza CHECK (wyrażenie)
Rozwiązanie dostępne po 3 próbach