Salt la conținutul principal
Modulul 9 · Lecția 1 din 433/57 în curs~10 min
Lecții din modul (1/4)

Tipuri de date avansate și ENUM

În lecția anterioară am văzut comanda de bază CREATE TABLE. Să explorăm acum câteva tipuri de date avansate pe care PostgreSQL le oferă pentru a ne modela domeniile într-un mod mai precis și mai sigur.

Tipuri numerice și text

PostgreSQL are mai multe tipuri de numere și text. Alegerea celui potrivit ajută atât la validare, cât și la spațiul de stocare.

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): Performanța în Postgres este identică. Folosiți VARCHAR(n) numai atunci când doriți să limitați în mod explicit lungimea inserată la nivel de bază de date.
  • NUMERIC(10, 2): Perfect pentru bani sau precizie aritmetică. Aici permite cel mult 8 cifre întregi și 2 zecimale (10 în total). Dacă introduceți 10.555, Postgres îl rotunjește la 10.56.

Tipul UUID

Pentru identificatorii securizați expuși pe web (cum ar fi ID-urile publice în adrese URL), UUID este adesea preferat față de incrementul clasic de SERIAL.

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

ENUM (enumerări)

Adesea, o coloană trebuie să conțină doar una dintre câteva valori predefinite (de exemplu, starea comenzii: „nou”, „plătit”, „expediat”). O abordare este utilizarea cuvântului cheie CHECK, dar PostgreSQL oferă tipuri personalizate 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'
);

Acest lucru garantează că nimeni nu poate introduce vreodată un statut nevalid, protejând consistența datelor.

Încearcă

Exercițiu#sql.m9.l1.e1
Încercări: 0Se încarcă…

Creați un tabel „user_reviews” cu: id (SERIAL pk), test_id (UUID cu gen_random_uuid() implicit), scor (intger nu nul) și conținut (TEXT). Niciunul dintre celelalte câmpuri nu are nevoie de constrângeri explicite dincolo de tip.

Se încarcă editorul...
Afișează indiciu

Scrieți CREATE TABLE user_reviews (...) și apoi diferitele câmpuri. Amintește-ți virgulele.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m9.l1.e2
Încercări: 0Se încarcă…

Mai întâi creați tipul ENUM „user_role” cu valorile „admin” și „user”. Apoi creați tabelul „enum_users” cu id (SERIAL pk) și rol (tipul pe care tocmai l-ați creat, NU NULL).

Se încarcă editorul...
Afișează indiciu

Nu uitați de ; pentru a separa cele două instrucțiuni (CREATE TYPE și CREATE TABLE).

Soluție disponibilă după 3 încercări