Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 3 z 431/57 w kursie~12 min
Lekcje modułu (3/4)

Tworzenie tabel i ograniczeń: DDL

Do tej pory pracowałeś nad tabelami, które już istnieją (customers, KODEF1…). DDL („język definicji danych”) odnosi się do stwierdzeń, że utwórz i zmodyfikuj sam schemat: tabele, kolumny, ograniczenia, indeksy.

UTWÓRZ TABELĘ: składnia

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

Przykład: lista życzeń łącząca klientów i produkty:

SQL
CREATE TABLE wishlists (
  id           SERIAL PRIMARY KEY,
  customer_id  INTEGER NOT NULL REFERENCES customers(id),
  product_id   INTEGER NOT NULL REFERENCES products(id),
  added_on     DATE NOT NULL DEFAULT CURRENT_DATE,
  note         TEXT,
  UNIQUE (customer_id, product_id)
);

Rozbijmy to kawałek po kawałku.

Najpopularniejsze typy

WpiszCo kryje
KODEF0 / KODEF1Liczby całkowite (-2,1B … +2,1B)
KODEF2Duże liczby całkowite
KODEF3Dokładne ułamki dziesiętne — pieniądze, procenty
KODEF4Ciągi o zmiennej długości
KODEF5Ciągi o maksymalnej długości n
KODEF7KODEF8 / KODEF9 / KODEF10
KODEF11Tylko data
KODEF12Data + godzina (bez strefy czasowej)
KODEF13Data + godzina ze strefą czasową
KODEF14INT5 z sekwencją automatycznego zwiększania

Ograniczenia

Ograniczenie to reguła, którą PostgreSQL wymusza automatycznie: jeśli an INSERT/UPDATE narusza to, operacja kończy się niepowodzeniem.

SQL
PRIMARY KEY                         -- identifica univocamente la riga, non NULL
NOT NULL                            -- vieta NULL
UNIQUE                              -- vieta duplicati su questa colonna
REFERENCES tabella(colonna)         -- foreign key
CHECK (espressione_booleana)        -- es. CHECK (price > 0)
DEFAULT espressione                 -- valore di default se non fornito

Ograniczenia można zadeklarować wbudowane w kolumnie lub na poziomie tabeli ograniczenia (poniżej pól). Przykład złożonego UNIQUE:

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

SPRAWDŹ ograniczenie

CHECK wymusza niestandardową regułę:

SQL
CREATE TABLE stock_alerts (
  product_id   INTEGER PRIMARY KEY REFERENCES products(id),
  threshold    INTEGER NOT NULL CHECK (threshold >= 0),
  notify_email TEXT    NOT NULL,
  active       BOOLEAN NOT NULL DEFAULT true
);

threshold musi wynosić ≥ 0; jeśli ktoś spróbuje INSERT … threshold = -5, to kończy się niepowodzeniem z powodu błędu wiązania.

Upuszczanie i modyfikowanie

SQL
DROP TABLE wishlists;                                 -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists;                       -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;

Twoja kolej

Ćwiczenie#sql.m8.l3.e1
Próby: 0Ładowanie...

Utwórz tabelę list życzeń z następującymi kolumnami: id (SERIAL PRIMARY KEY), klient_id (INTEGER NIE NULL REFERENCES klienci (id)), produkt_id (INTEGER NIE NULL REFERENCES produkty (id)), add_on (DATA NIE NULL z DOMYŚLNĄ BIEŻĄCĄ DATĄ). Dodaj UNIKALNE ograniczenie dla pary (identyfikator_klienta, identyfikator_produktu).

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

UNIKALNE (id_klienta, id_produktu) jako ograniczenie na poziomie tabeli na dole.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m8.l3.e2
Próby: 0Ładowanie...

Dodaj do tabeli klientów kolumnę biuletynu typu BOOLEAN, NOT NULL, z wartością DEFAULT false. Użyj pojedynczej instrukcji ALTER TABLE.

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

Bez DEFAULT operacja ALTER nie powiedzie się, ponieważ wiersze już istnieją, a nowa kolumna NIE ma wartości NULL.

Rozwiązanie dostępne po 3 próbach