Módulo 7 · Diseñar estructuras

Protege los datos con restricciones

Convierte las reglas del dominio en comprobaciones de la base de datos.

26 minNivel IntermedioAntes necesitas: CREATE TABLE y relaciones

0 de 45 lecciones

Al terminar, podrás

  • Distinguir claves, obligatoriedad y validación.
  • Elegir la restricción adecuada para cada regla.
  • Probar una definición con filas válidas e inválidas.

Recupera lo aprendido: ¿Definir el tipo de una columna basta para exigir que tenga siempre un valor?

La idea clave

Una restricción convierte una regla del dominio en una regla que la base puede comprobar. PRIMARY KEY identifica, NOT NULL exige un valor, UNIQUE evita repeticiones, CHECK valida una condición y FOREIGN KEY protege una relación.

Traduce la regla antes de elegir la restricción
Regla que quieres protegerRestricción habitual
“cada fila tiene un identificador único”PRIMARY KEY
“este dato es obligatorio”NOT NULL
“no se puede repetir”UNIQUE
“debe cumplir una condición”CHECK
“debe referirse a una fila existente”FOREIGN KEY

No todas las reglas son intercambiables: una clave primaria identifica filas; una clave foránea comprueba que la referencia exista.

La sintaxis básica

Reglas de columna y tabla
CREATE TABLE reseñas (
  id INTEGER PRIMARY KEY,
  producto_id INTEGER NOT NULL,
  puntuacion INTEGER NOT NULL CHECK (puntuacion BETWEEN 1 AND 5),
  comentario TEXT,
  FOREIGN KEY (producto_id) REFERENCES productos(id)
);

Reglas que se complementan: CHECK (puntuacion BETWEEN 1 AND 5) controla el rango; NOT NULL exige una puntuación. Un CHECK cuyo resultado es desconocido no rechaza el valor ausente. De igual forma, una clave foránea permite NULL salvo que la columna sea obligatoria. Consulta las reglas de CREATE TABLE en SQLite.

Ejemplo paso a paso

La tabla reseñas debe impedir puntuaciones fuera del intervalo y referencias a productos inexistentes.

Definición comprobada
CREATE TABLE reseñas (
  id INTEGER PRIMARY KEY,
  producto_id INTEGER NOT NULL,
  puntuacion INTEGER NOT NULL CHECK (puntuacion BETWEEN 1 AND 5),
  comentario TEXT,
  FOREIGN KEY (producto_id) REFERENCES productos(id)
);

INSERT INTO reseñas (id, producto_id, puntuacion, comentario)
VALUES (1, 2, 5, 'Teclado cómodo');
Fila válida
idproducto_idpuntuacioncomentario
125Teclado cómodo

Qué comprueba cada regla

  1. El identificador 1 no puede repetirse.
  2. producto_id debe contener un valor y referenciar un producto existente.
  3. La puntuación debe estar entre 1 y 5; el comentario puede ser NULL.

CHECK no sustituye a NOT NULL: si la expresión de comprobación queda en valor desconocido por un NULL, no se considera falsa. Cuando el dato sea obligatorio y además deba respetar un rango, combina ambas restricciones.

Comprueba tu comprensión

¿Qué restricción protege una relación entre tablas?

Un error habitual

Usar UNIQUE donde existe una relación de uno a muchos

Consulta problemática
cliente_id INTEGER UNIQUE REFERENCES clientes(id)

La restricción UNIQUE permitiría un solo registro por cliente. En tablas como pedidos, un cliente puede tener varios pedidos, por lo que la clave foránea no debe ser única.

Practica con datos

Laboratorio SQL

Resuelve la consulta

Pendiente

Crea tareas con id INTEGER como clave primaria, titulo VARCHAR(200) obligatorio y completada INTEGER con valor predeterminado 0.

Resultado esperado: la tabla tareas con las columnas id, titulo y completada y sus restricciones.

La consulta usa datos ficticios y se ejecuta solo en este navegador.

Fuentes técnicas consultadas

Las fuentes documentan las restricciones principales. En SQLite, la aplicación de claves foráneas debe habilitarse explícitamente en cada conexión con PRAGMA foreign_keys = ON. El laboratorio de AprenderSQL.es no es SQLite: aplica de forma local NOT NULL, claves primarias, unicidad —también compuesta—, CHECK y las claves foráneas declaradas con comportamiento inmediato. No simula restricciones diferidas ni acciones como ON DELETE CASCADE.

Comprueba si puedes explicarlo

¿CHECK (puntuacion BETWEEN 1 AND 5) impide por sí solo guardar NULL?

Ver respuesta razonada

No. CHECK rechaza una condición falsa, pero un resultado desconocido no la incumple. Combina CHECK con NOT NULL si la puntuación también es obligatoria.

Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.

Qué debes recordar

  • Las restricciones deben expresar reglas reales del dominio.
  • PRIMARY KEY y FOREIGN KEY tienen responsabilidades diferentes.
  • Prueba tanto filas válidas como intentos que deben ser rechazados.

A continuación: aprende a modificar una tabla ya creada.

Conceptos relacionados