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
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Przykład: lista życzeń łącząca klientów i produkty:
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
| Wpisz | Co kryje |
|---|---|
| KODEF0 / KODEF1 | Liczby całkowite (-2,1B … +2,1B) |
| KODEF2 | Duże liczby całkowite |
| KODEF3 | Dokładne ułamki dziesiętne — pieniądze, procenty |
| KODEF4 | Ciągi o zmiennej długości |
| KODEF5 | Ciągi o maksymalnej długości n |
| KODEF7 | KODEF8 / KODEF9 / KODEF10 |
| KODEF11 | Tylko data |
| KODEF12 | Data + godzina (bez strefy czasowej) |
| KODEF13 | Data + godzina ze strefą czasową |
| KODEF14 | INT5 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.
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 fornitoOgraniczenia można zadeklarować wbudowane w kolumnie lub na poziomie tabeli
ograniczenia (poniżej pól). Przykład złożonego UNIQUE:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataSPRAWDŹ ograniczenie
CHECK wymusza niestandardową regułę:
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
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
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).
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
Dodaj do tabeli klientów kolumnę biuletynu typu BOOLEAN, NOT NULL, z wartością DEFAULT false. Użyj pojedynczej instrukcji ALTER TABLE.
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