Lecciones del módulo (3/4)
Crear tablas y restricciones: DDL
Hasta ahora has estado trabajando en tablas que ya existen (customers,
CÓDIGOPH1…). DDL ("lenguaje de definición de datos") se refiere a las declaraciones que
crear y modificar el esquema mismo: tablas, columnas, restricciones,
índices.
CREAR TABLA: la sintaxis
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Ejemplo: una lista de deseos que vincula clientes y productos:
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)
);Analicémoslo pieza por pieza.
Los tipos más comunes
| Tipo | Lo que contiene |
|---|---|
| CÓDIGOPH0 / CÓDIGOPH1 | Números enteros (-2,1 mil millones … +2,1 mil millones) |
| CÓDIGOPH2 | Enteros grandes |
| CÓDIGOPH3 | Decimales exactos: dinero, porcentajes |
| CÓDIGOPH4 | Cadenas de longitud variable |
| CÓDIGOPH5 | Cadenas con una longitud máxima de n |
| CÓDIGOPH7 | CÓDIGOPH8 / CÓDIGOPH9 / CÓDIGOPH10 |
| CÓDIGOPH11 | Sólo fecha |
| CÓDIGOPH12 | Fecha + hora (sin zona horaria) |
| CÓDIGOPH13 | Fecha + hora con zona horaria |
| CÓDIGOPH14 | INT5 con secuencia autoincremental |
Restricciones
Una restricción es una regla que PostgreSQL aplica automáticamente: si una
INSERT/UPDATE lo viola, la operación falla.
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 fornitoLas restricciones se pueden declarar en línea en una columna o como a nivel de tabla
restricciones (debajo de los campos). Ejemplo de un UNIQUE compuesto:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataVERIFICAR restricción
CHECK aplica una regla personalizada:
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 debe ser ≥ 0; si alguien prueba INSERT … threshold = -5,
falla con un error de restricción.
Dejar caer y alterar
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;Tu turno
Cree una tabla de listas de deseos con las siguientes columnas: id (CLAVE PRIMARIA DE SERIE), id_cliente (REFERENCIAS INTEGER NO NULAS clientes (id)), id_producto (REFERENCIAS INTEGER NO NULAS productos (id)), add_on (FECHA NO NULA con FECHA_ACTUAL PREDETERMINADA). Agregue una restricción ÚNICA en el par (customer_id, product_id).
Mostrar pista
ÚNICO (customer_id, product_id) como restricción a nivel de tabla en la parte inferior.
Solución disponible después de 3 intentos
Ejercicio de revisión
Agregue a la tabla de clientes una columna de boletín de tipo BOOLEAN, NOT NULL, con DEFAULT false. Utilice una única instrucción ALTER TABLE.
Mostrar pista
Sin DEFAULT, ALTER fallaría porque ya existen filas y la nueva columna NO es NULA.
Solución disponible después de 3 intentos