Contenido de esta guía
Qué protege una restricción CHECK
CHECK coloca una regla junto a la estructura de la tabla. Cada inserción o modificación debe respetarla, sin depender de que todas las aplicaciones recuerden validar el dato.
Es apropiada para condiciones que una fila puede comprobar por sí misma: cantidades positivas, porcentajes entre 0 y 100 o una fecha final posterior a la inicial.
Dos formas de declararla
CREATE TABLE cupones (
id INTEGER PRIMARY KEY,
descuento INTEGER CHECK (descuento BETWEEN 0 AND 100)
);
CREATE TABLE periodos (
inicio DATE,
fin DATE,
CONSTRAINT fin_posterior CHECK (fin >= inicio)
);Una restricción con nombre facilita identificar el error y modificar el esquema. La sintaxis concreta para añadir o eliminar restricciones después de crear la tabla varía entre motores.
Ejemplo guiado
La tabla de cupones acepta un descuento del 20 %, pero rechaza 140 porque supera el máximo:
INSERT INTO cupones (id, descuento) VALUES (1, 20);
SELECT id, descuento FROM cupones;
-- Esta sentencia falla:
INSERT INTO cupones (id, descuento) VALUES (2, 140);| id | descuento |
|---|---|
| 1 | 20 |
SQLite devuelve un error de restricción CHECK para la segunda inserción. La fila inválida no se guarda.
CHECK y los valores NULL
En los motores habituales, CHECK bloquea una fila cuando la expresión es falsa; una expresión desconocida por NULL puede no bloquearla. Si la columna también debe ser obligatoria, combina la regla con NOT NULL.
CHECK no sustituye todas las relaciones. Para garantizar que un valor existe en otra tabla utiliza una FOREIGN KEY, no una subconsulta dentro de CHECK.
Error frecuente
Duplicar una regla compleja en muchas tablas
Una restricción debe ser clara, estable y comprobable con la fila actual. Cuando la regla depende de procesos, históricos o varias tablas, quizá necesites otro diseño o lógica transaccional.
Comprueba lo aprendido
Crea una escala de valoración
Escribe una tabla valoraciones con id como clave primaria y puntuacion obligatoria entre 1 y 5. Después consulta su definición en SQLite.
puntuacion INTEGER NOT NULL.CHECK (puntuacion BETWEEN 1 AND 5).sqlite_schema filtrando por el nombre de la tabla.Solución razonada
CREATE TABLE valoraciones (
id INTEGER PRIMARY KEY,
puntuacion INTEGER NOT NULL
CHECK (puntuacion BETWEEN 1 AND 5)
);
SELECT name
FROM sqlite_schema
WHERE type = 'table' AND name = 'valoraciones';| name |
|---|
| valoraciones |
La fila confirma que la tabla existe. Prueba después valores 1 y 5, y comprueba que 0 o 6 generan un error.
Compatibilidad entre motores
CHECK forma parte del SQL relacional habitual, pero existen diferencias históricas y de sintaxis al modificar restricciones. Verifica también las funciones permitidas dentro de la expresión. En PostgreSQL, por ejemplo, una CHECK no debe depender de datos de otras filas o tablas.
Qué debes recordar
- CHECK impide filas que hacen falsa una regla.
- Combínala con NOT NULL cuando el dato sea obligatorio.
- Da nombre a las restricciones importantes.
- Usa claves foráneas para relaciones entre tablas.
Conceptos relacionados
Fuentes técnicas
La explicación se ha contrastado con documentación oficial: