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.
| Regla que quieres proteger | Restricció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
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.
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');| id | producto_id | puntuacion | comentario |
|---|---|---|---|
| 1 | 2 | 5 | Teclado cómodo |
Qué comprueba cada regla
- El identificador 1 no puede repetirse.
producto_iddebe contener un valor y referenciar un producto existente.- 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.
Un error habitual
Usar UNIQUE donde existe una relación de uno a muchos
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
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.
Añade PRIMARY KEY a id.
Añade NOT NULL a titulo.
Utiliza DEFAULT 0 en completada.
Solución
CREATE TABLE tareas (id INTEGER PRIMARY KEY, titulo VARCHAR(200) NOT NULL, completada INTEGER DEFAULT 0);Cada restricción expresa una regla distinta del dominio.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
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.
- PostgreSQL: restricciones
- SQLite: CREATE TABLE y restricciones
- SQLite: claves foráneas
- MySQL 8.4: restricciones
- SQL Server: claves primarias y foráneas
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.