El síntoma: un valor queda fuera de la regla declarada
Las restricciones CHECK permiten expresar condiciones que cada fila debe respetar. PostgreSQL documenta que la restricción se considera satisfecha cuando la expresión resulta verdadera o nula; SQLite también evalúa la expresión de CHECK al insertar o actualizar la fila.
Por eso el diagnóstico debe separar dos preguntas: ¿el dato viola realmente la regla? y ¿la expresión representa correctamente el dominio?
Ejemplo reproducible: descuento fuera de rango
CREATE TABLE cupones (
codigo TEXT PRIMARY KEY,
descuento INTEGER NOT NULL
CHECK (descuento BETWEEN 1 AND 100)
);
INSERT INTO cupones (codigo, descuento)
VALUES ('VERANO', 130);El valor 130 queda fuera del rango permitido. Si el dominio define el descuento como porcentaje entre 1 y 100, la restricción está detectando un dato inválido.
Prueba la condición con el valor real
INSERT INTO cupones (codigo, descuento)
VALUES ('VERANO', 30);Si 130 debía ser válido por una regla de negocio diferente, modifica el modelo de forma deliberada y documentada. No cambies CHECK solo para aceptar una fila concreta sin comprender su significado.
CHECK no sustituye a NOT NULL
En PostgreSQL, una expresión CHECK que produce NULL no se considera una violación. SQLite también acepta una fila cuando la expresión de la restricción resulta nula. Si una columna además debe ser obligatoria, declara NOT NULL explícitamente.
Método de diagnóstico
- Localiza la restricción y copia su expresión.
- Sustituye mentalmente las columnas por los valores de la fila rechazada.
- Comprueba rango, signo, unidades y NULL.
- Corrige el dato si la regla representa el dominio.
- Revisa la restricción solo si la regla de negocio cambió o estaba mal expresada.
Error frecuente: ampliar la regla hasta que pase el dato
Una restricción demasiado permisiva deja de protegerte
Si cambias un rango válido solo porque apareció una fila fuera de él, puedes convertir un error de entrada en datos incorrectos persistentes.
Práctica correctiva
Diagnostica una cantidad negativa
La tabla lineas_pedido exige CHECK (cantidad > 0) y una fila llega con cantidad = -2. Decide qué debes corregir.
Solución razonada
La fila viola la condición. Si lineas_pedido solo representa unidades pedidas, corrige el dato y conserva CHECK (cantidad > 0). Si el negocio necesita devoluciones, modela ese proceso explícitamente en lugar de debilitar una regla válida.
Qué debes recordar
CHECKexpresa una condición que debe cumplir cada fila.- Evalúa la regla con los valores concretos que fueron rechazados.
- Combina CHECK con NOT NULL cuando la columna también sea obligatoria.
- No amplíes la condición solo para hacer pasar un dato dudoso.