Saltar al contenido principal
eLearner.app
Módulo 9 · Lección 1 de 433/57 en el curso~10 min
Lecciones del módulo (1/4)

Tipos de datos avanzados y ENUMs

En la lección anterior vimos el comando CREATE TABLE básico. Exploremos ahora algunos tipos de datos avanzados que ofrece PostgreSQL para modelar nuestros dominios de una forma más precisa y segura.

Tipos numéricos y de texto

PostgreSQL tiene varios tipos de números y texto. Elegir el correcto ayuda tanto con la validación como con el espacio de almacenamiento.

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): En Postgres el rendimiento es idéntico. Utilice VARCHAR(n) solo cuando desea limitar explícitamente la longitud insertada en el nivel de la base de datos.
  • NUMERIC(10, 2): Perfecto para dinero o precisión aritmética. Aquí permite como máximo 8 dígitos enteros y 2 decimales (10 en total). Si inserta 10.555, Postgres lo redondea a 10.56.

El tipo de UUID

Para identificadores seguros expuestos en la web (como ID públicos en URL), a menudo se prefiere UUID al incremento clásico SERIAL.

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

ENUM (Enumeraciones)

A menudo, una columna debe contener sólo uno de unos pocos valores predefinidos (por ejemplo, estado del pedido: "nuevo", "pagado", "enviado"). Un enfoque es utilizar la palabra clave CHECK, pero PostgreSQL ofrece tipos ENUM personalizados.

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

Esto garantiza que nadie pueda insertar un estado no válido, protegiendo la coherencia de los datos.

Pruébalo

Ejercicio#sql.m9.l1.e1
Intentos: 0Cargando...

Cree una tabla 'user_reviews' con: id (SERIAL pk), test_id (UUID con gen_random_uuid() predeterminado), puntuación (entero no nulo) y contenido (TEXTO). Ninguno de los otros campos necesita restricciones explícitas más allá del tipo.

Cargando editor...
Mostrar pista

Escriba CREATE TABLE user_reviews (...) y luego los distintos campos. Recuerda las comas.

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m9.l1.e2
Intentos: 0Cargando...

Primero cree el tipo ENUM 'user_role' con los valores 'admin' y 'user'. Luego cree la tabla 'enum_users' con id (SERIAL pk) y rol (el tipo que acaba de crear, NO NULL).

Cargando editor...
Mostrar pista

No olvides el; para separar las dos declaraciones (CREAR TIPO y CREAR TABLA).

Solución disponible después de 3 intentos