Przejdź do głównej treści
eLearner.app
Moduł 9 · Lekcja 2 z 434/57 w kursie~12 min
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.

SQL
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 w customers.
  • Uniemożliwia DELETE (usunięcie) klienta z customers, 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:

SQL
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADE

W 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.

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)
);

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!

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

Spróbuj

Ćwiczenie#sql.m9.l2.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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ą

Ćwiczenie#sql.m9.l2.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Dodaj ograniczenie na dole za pomocą CONSTRAINT check_capienza CHECK (wyrażenie)

Rozwiązanie dostępne po 3 próbach