Przejdź do głównej treści
eLearner.app
Moduł 9 · Lekcja 1 z 433/57 w kursie~10 min
Lekcje modułu (1/4)

Zaawansowane typy danych i typy ENUM

W poprzedniej lekcji widzieliśmy podstawowe polecenie CREATE TABLE. Przyjrzyjmy się teraz niektórym zaawansowanym typom danych, które oferuje PostgreSQL, aby modelować nasze domeny w bardziej precyzyjny i bezpieczny sposób.

Typy numeryczne i tekstowe

PostgreSQL ma kilka typów liczb i tekstu. Wybór odpowiedniego pomaga zarówno w walidacji, jak i w przestrzeni dyskowej.

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT vs VARCHAR(n): W Postgres wydajność jest identyczna. Używasz VARCHAR(n) tylko wtedy, gdy chcesz jawnie ograniczyć wstawianą długość na poziomie bazy danych.
  • NUMERIC(10, 2): Idealny do pomiaru pieniędzy lub precyzji arytmetycznej. Tutaj pozwala na maksymalnie 8 cyfr całkowitych i 2 miejsca po przecinku (w sumie 10). Jeśli wstawisz 10.555, Postgres zaokrągli go do 10.56.

Typ UUID

W przypadku bezpiecznych identyfikatorów udostępnianych w Internecie (takich jak identyfikatory publiczne w adresach URL) często preferowany jest UUID w porównaniu z klasycznym przyrostem SERIAL.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (Wyliczenia)

Często kolumna musi zawierać tylko jedną z kilku predefiniowanych wartości (np. status zamówienia: „nowe”, „zapłacone”, „wysłane”). Jednym z podejść jest użycie słowa kluczowego CHECK, ale PostgreSQL oferuje niestandardowe typy ENUM.

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

Gwarantuje to, że nikt nigdy nie będzie mógł wstawić nieprawidłowego statusu, chroniąc spójność danych.

Spróbuj

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

Utwórz tabelę „user_reviews” zawierającą: id (SERIAL pk), test_id (UUID z domyślnym gen_random_uuid()), wynik (liczba całkowita nie null) i treść (TEKST). Żadne z pozostałych pól nie wymaga wyraźnych ograniczeń poza typem.

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

Napisz CREATE TABLE user_reviews (...), a następnie różne pola. Pamiętaj o przecinkach.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

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

Najpierw utwórz typ ENUM „user_role” z wartościami „admin” i „user”. Następnie utwórz tabelę „enum_users” z identyfikatorem (SERIAL pk) i rolą (właśnie utworzony typ, NIE NULL).

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

Nie zapomnij o ; aby oddzielić dwie instrukcje (CREATE TYPE i CREATE TABLE).

Rozwiązanie dostępne po 3 próbach