Direct naar de hoofdinhoud
Module 9 · Les 1 van 433/57 in de cursus~10 min
Modulelessen (1/4)

Geavanceerde gegevenstypen en ENUM's

In de vorige les hebben we het basiscommando CREATE TABLE gezien. Laten we nu enkele geavanceerde gegevenstypen verkennen die PostgreSQL biedt om onze domeinen op een nauwkeurigere en veiligere manier te modelleren.

Numerieke en teksttypen

PostgreSQL heeft verschillende typen voor getallen en tekst. Het kiezen van de juiste helpt zowel bij de validatie als bij de opslagruimte.

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 versus VARCHAR(n): in Postgres zijn de prestaties identiek. U gebruikt VARCHAR(n) alleen als u de ingevoegde lengte op databaseniveau expliciet wilt beperken.
  • NUMERIC(10, 2): Perfect voor geld of rekenkundige precisie. Hier zijn maximaal 8 gehele cijfers en 2 decimalen toegestaan ​​(10 in totaal). Als je 10.555 invoegt, rondt Postgres dit af naar 10.56.

Het UUID-type

Voor veilige ID's die op internet worden weergegeven (zoals openbare ID's in URL's), wordt vaak de voorkeur gegeven aan UUID boven de klassieke verhoging van SERIAL.

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

ENUM (opsommingen)

Vaak moet een kolom slechts één van een paar vooraf gedefinieerde waarden bevatten (bijvoorbeeld bestelstatus: "nieuw", "betaald", "verzonden"). Eén benadering is het gebruik van het trefwoord CHECK, maar PostgreSQL biedt aangepaste ENUM-typen.

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

Dit garandeert dat niemand ooit een ongeldige status kan invoeren, waardoor de gegevensconsistentie wordt beschermd.

Probeer het

Oefening#sql.m9.l1.e1
Pogingen: 0Laden…

Maak een 'user_reviews'-tabel met: id (SERIAL pk), test_id (UUID met standaard gen_random_uuid()), score (geheel getal, niet nul) en inhoud (TEXT). Voor geen van de andere velden zijn expliciete beperkingen nodig die verder gaan dan het type.

Editor laden…
Toon hint

Schrijf CREATE TABLE user_reviews (...) en vervolgens de verschillende velden. Onthoud de komma's.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m9.l1.e2
Pogingen: 0Laden…

Maak eerst het ENUM-type 'user_role' aan met de waarden 'admin' en 'user'. Maak vervolgens de tabel 'enum_users' met id (SERIAL pk) en rol (het type dat u zojuist hebt gemaakt, NIET NULL).

Editor laden…
Toon hint

Vergeet de ; om de twee instructies (het CREATE TYPE en de CREATE TABLE) van elkaar te scheiden.

Oplossing beschikbaar na 3 pogingen