Ir al contenido
wannacode

Restricciones: reglas para los datos

En resumen: Las restricciones (NOT NULL, DEFAULT, UNIQUE, CHECK, PRIMARY KEY) son reglas escritas en CREATE TABLE con las que la propia base de datos rechaza las filas incorrectas.

Problema

Una tabla que acepta cualquier cosa

Aquí tienes una tabla para los proveedores sin ninguna regla. Ejecuta la consulta:

SQLbase de datos vacía

Entró un proveedor sin nombre. El mismo número de IVA entró dos veces. Entró una valoración de 7 en una escala del 1 al 5. Nadie comprobó nada.

En el módulo sobre cambiar los datos, la tienda rechazaba filas así con errores. Esos errores vienen de reglas escritas en CREATE TABLE. Ahora las escribirás tú.

La idea

NOT NULL y DEFAULT

Las reglas se escriben después del tipo de la columna. Se llaman restricciones (constraints).

  • NOT NULL: la columna no puede estar vacía.
  • DEFAULT valor: lo que se guarda si el INSERT no da ningún valor.
SQLbase de datos vacía

La lechería recibió «Sofía», porque no se dio su ciudad. Un proveedor sin nombre no entra:

SQLbase de datos vacía

DEFAULT CURRENT_DATE guarda la fecha de hoy. Es útil para «cuándo se añadió»:

SQLbase de datos vacía

1 significa «sí, es la fecha de hoy». Cambia added_at = CURRENT_DATE por added_at solo y verás la fecha misma.

Más precisamente, para curiosos

CURRENT_DATE en SQLite es la fecha en UTC, no en hora local. En Bulgaria, entre la medianoche y las 2 o 3 de la madrugada, la fecha local ya es la nueva mientras que UTC todavía tiene la anterior. CURRENT_TIMESTAMP da la fecha y la hora, también en UTC.

Pruébalo

Los campos obligatorios

La tabla deliveries tiene id, supplier_id, amount y status. Haz obligatorios el proveedor y el importe, y el estado obligatorio con el valor por defecto 'expected'.

SQLbase de datos vacía

La idea

UNIQUE

UNIQUE prohíbe dos valores iguales en la columna. Una empresa tiene un número de IVA:

SQLbase de datos vacía

A veces lo único es el par. Cada proveedor da un precio por producto. Dos proveedores pueden ofrecer el mismo producto, y un proveedor ofrece muchos productos. La regla se escribe aparte, después de las columnas, con las dos columnas entre paréntesis:

SQLbase de datos vacía

Las tres primeras filas entran. La cuarta es un segundo precio del proveedor 1 para el producto 1.

Más precisamente, para curiosos

UNIQUE permite muchos NULL: dos proveedores sin número de IVA no cuentan como iguales, porque NULL no es igual a NULL. Si el número de IVA es obligatorio, escribe vat TEXT NOT NULL UNIQUE. PostgreSQL funciona igual. SQL Server por defecto deja entrar un solo NULL en una columna UNIQUE.

La idea

CHECK

CHECK (condición) deja entrar la fila solo si la condición es verdadera. La condición es como la de WHERE:

SQLbase de datos vacía

Cuando la condición es sobre varias columnas, CHECK va después de las columnas. Una promoción no puede terminar antes de empezar:

SQLbase de datos vacía

El mensaje de SQLite dice qué condición falló. Por eso conviene que las condiciones sean cortas y claras.

Míralo

CHECK deja pasar NULL

La valoración va de 1 a 5. ¿Y si no se da?

SQLbase de datos vacía

Entró. CHECK rechaza la fila solo cuando la condición es falsa. NULL BETWEEN 1 AND 5 es «desconocido», como toda comparación con NULL. Es lo contrario de WHERE, que se queda solo con lo verdadero.

Aquí es lo correcto: un proveedor nuevo todavía no tiene valoración. Pero si el valor es obligatorio, CHECK no basta. Necesitas además NOT NULL.

Pruébalo

Los precios de los proveedores

La tabla supplier_prices tiene supplier_id, product_id y price. El precio es obligatorio y mayor que 0, y cada proveedor tiene un solo precio para un producto dado. Añade las reglas.

SQLbase de datos vacía

La idea

PRIMARY KEY

Ya conoces la clave primaria: la columna por la que se reconoce una fila. En CREATE TABLE es una restricción como las demás. No deja entrar dos filas con la misma clave:

SQLbase de datos vacía

Cuando la clave tiene dos columnas, se escribe aparte, como UNIQUE. Así es en order_items: un producto está una vez en un pedido, y la cantidad está en quantity.

order_items

  • PKorder_idinteger→ orders
  • PKproduct_idinteger→ products
  • quantityinteger *
  • unit_pricereal *
Más precisamente, para curiosos

SQLite tiene una rareza antigua: una clave primaria que no es INTEGER PRIMARY KEY acepta NULL. Ejecútalo:

SQLbase de datos vacía

Dos cupones sin código. Es un error de las primeras versiones que se conservó para que los programas antiguos no se rompan. En una tabla STRICT la clave primaria no acepta NULL. En todos los demás casos, escribe code TEXT NOT NULL PRIMARY KEY. En PostgreSQL y MySQL la clave primaria siempre es NOT NULL.

Ejercicio

Los proveedores, bien hechos

Crea la tabla suppliers definitiva: id (clave primaria), name (obligatorio), vat (número de IVA, obligatorio y sin repeticiones), city (obligatoria, con el valor por defecto 'Sofía') y rating (un número entero de 1 a 5, puede faltar). La comprobación también intentará añadir proveedores malos.

SQLbase de datos vacía

Test

Ponte a prueba

1. La columna es city TEXT NOT NULL DEFAULT 'Sofía'. ¿Qué pasa con un INSERT que no da ninguna ciudad?
2. ¿Cómo dices «un proveedor tiene un precio por producto» si dos proveedores pueden ofrecer el mismo producto?
3. La columna es rating INTEGER CHECK (rating BETWEEN 1 AND 5). ¿Qué entra?
4. ¿Qué significa PRIMARY KEY (order_id, product_id) en order_items?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·