CHECK en SQL: qué es, cómo se usa y ejemplos prácticos

En SQL, la restricción CHECK se utiliza para garantizar que los valores que se insertan o actualizan en una columna de una tabla cumplan una condición lógica predefinida. Es una herramienta de integridad que ayuda a asegurar que los datos almacenados en la base de datos sean correctos y consistentes con las reglas del negocio.

Por ejemplo, podemos usar CHECK para asegurarnos de que la edad de una persona no sea negativa, que una fecha no sea anterior al año 2000 o que el porcentaje de descuento esté siempre entre 0 y 100.

¿Qué es la restricción CHECK?

  • Es un constraint (restricción) de SQL que impone una condición en los valores de una columna o en una fila.
  • Si la condición no se cumple, la base de datos rechaza la operación de INSERT o UPDATE.
  • Se puede definir a nivel columna o a nivel tabla.
  • Ayuda a mantener la integridad de los datos directamente en la base de datos, en lugar de depender solo de la lógica de la aplicación.

Sintaxis de CHECK

A nivel de columna

CREATE TABLE empleados (
  id INT PRIMARY KEY,
  nombre VARCHAR(100),
  edad INT CHECK (edad >= 18)
);

👉 Aquí la columna edad debe ser siempre mayor o igual a 18.

A nivel de tabla

CREATE TABLE productos (
  id INT PRIMARY KEY,
  nombre VARCHAR(100),
  precio DECIMAL(10,2),
  descuento DECIMAL(5,2),
  CHECK (descuento >= 0 AND descuento <= precio)
);

👉 La condición afecta a varias columnas: el descuento debe estar entre 0 y el precio.

Ejemplos prácticos de CHECK

1. Validar que un valor sea positivo

CREATE TABLE cuentas (
  id INT PRIMARY KEY,
  saldo DECIMAL(10,2) CHECK (saldo >= 0)
);

👉 Impide que una cuenta bancaria tenga saldo negativo.

2. Restringir un rango de valores con BETWEEN.

CREATE TABLE estudiantes (
  id INT PRIMARY KEY,
  nota DECIMAL(3,1) CHECK (nota BETWEEN 0 AND 10)
);

👉 La nota siempre debe estar entre 0 y 10.

3. Validar opciones específicas con IN.

CREATE TABLE empleados (
  id INT PRIMARY KEY,
  genero CHAR(1) CHECK (genero IN ('M','F'))
);

👉 Solo se permiten los valores M o F en la columna genero.

4. Usar CHECK con fechas

CREATE TABLE pedidos (
  id INT PRIMARY KEY,
  fecha DATE CHECK (fecha >= '2000-01-01')
);

👉 Asegura que no se registren pedidos anteriores al año 2000.

5. Condición entre columnas

CREATE TABLE reservas (
  id INT PRIMARY KEY,
  fecha_inicio DATE,
  fecha_fin DATE,
  CHECK (fecha_fin >= fecha_inicio)
);

👉 Evita que la fecha de fin sea anterior a la de inicio.

Modificar restricciones CHECK con ALTER TABLE

Podemos añadir o eliminar restricciones en tablas ya creadas.

Agregar una restricción con ALTER TABLE.

ALTER TABLE empleados
ADD CONSTRAINT chk_edad CHECK (edad >= 18);

Eliminar una restricción CHECK

ALTER TABLE empleados
DROP CONSTRAINT chk_edad;

(El nombre de la restricción depende del SGBD. Si no se asigna un nombre, el motor genera uno automáticamente.)

Ventajas de usar CHECK

  1. Integridad en la base de datos: no depende del código de la aplicación.
  2. Automatización de validaciones: evita errores humanos al ingresar datos.
  3. Mantenimiento más sencillo: las reglas están centralizadas en la base.
  4. Consistencia en múltiples aplicaciones: todos los sistemas que usen esa base respetan las mismas condiciones.

Limitaciones de CHECK

  • No todos los SGBD implementan CHECK de la misma forma.
    • En MySQL versiones antiguas, CHECK se ignoraba. Desde MySQL 8.0.16 ya se aplica correctamente.
    • En PostgreSQL, SQL Server y Oracle está plenamente soportado.
  • No permite condiciones complejas con subconsultas en la mayoría de los motores.
  • Puede generar errores si intentamos insertar o actualizar datos que no cumplen la condición.

Errores comunes con CHECK

  1. Definir condiciones imposibles: CHECK (edad < 0) 👉 Ningún dato pasará la validación, por lo que la tabla será prácticamente inutilizable.
  2. Olvidar que los NULL se permiten: CHECK (edad >= 18) 👉 Un NULL no se evalúa como FALSE, sino como UNKNOWN, por lo que normalmente sí se permite. Si querés evitarlo, también hay que usar NOT NULL.
  3. No asignar nombres a las restricciones: si el motor genera nombres automáticos, luego es difícil eliminarlos o modificarlos.
  4. Confundir CHECK con triggers: CHECK solo evalúa condiciones simples; para validaciones más avanzadas se usan triggers.

Buenas prácticas con CHECK

  • Siempre nombrar las restricciones (CONSTRAINT chk_nota, chk_edad).
  • Combinar con NOT NULL cuando no querés permitir valores vacíos.
  • Usar IN cuando haya un conjunto limitado de valores válidos.
  • Evitar condiciones demasiado complejas: mantenerlo simple mejora la performance y claridad.
  • Probar inserciones y actualizaciones después de definir la restricción.

Ejemplo avanzado: control de empleados

CREATE TABLE empleados (
  id INT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  edad INT CHECK (edad BETWEEN 18 AND 65),
  salario DECIMAL(10,2) CHECK (salario > 0),
  departamento VARCHAR(50) CHECK (departamento IN ('IT','Ventas','RRHH'))
);

👉 Con estas restricciones:

  • La edad solo puede ser entre 18 y 65.
  • El salario debe ser mayor a 0.
  • El departamento debe estar dentro de una lista predefinida.

Esto asegura que los datos cargados siempre respeten las reglas del negocio.

Preguntas frecuentes (FAQ)

1. ¿Qué pasa si intento insertar un dato que viola un CHECK?
La base de datos devuelve un error y la operación se rechaza.

2. ¿CHECK funciona con valores NULL?
Generalmente, NULL pasa la restricción porque la condición no se evalúa como FALSE. Para prohibirlo, se combina con NOT NULL.

3. ¿Puedo usar CHECK en varias columnas a la vez?
Sí, en restricciones a nivel de tabla se pueden incluir varias columnas.

4. ¿Puedo modificar un CHECK existente?
No directamente: primero se elimina con DROP CONSTRAINT y luego se vuelve a crear con la condición nueva.

5. ¿Es mejor usar CHECK o validarlo desde la aplicación?
Lo ideal es usar ambos: la aplicación valida para mejorar la experiencia del usuario, y la base de datos refuerza las reglas para garantizar integridad.

Conclusión

La restricción CHECK en SQL es una herramienta poderosa para garantizar la calidad y consistencia de los datos. Al definir reglas directamente en la base, aseguramos que ninguna aplicación pueda introducir valores inválidos.

Aunque tiene limitaciones en algunos motores, en la mayoría de los sistemas modernos se aplica correctamente y se combina muy bien con otras restricciones (NOT NULL, UNIQUE, FOREIGN KEY).

Dominar su uso es clave para diseñar bases de datos robustas y confiables.

Amplía sobre restricciones de columnas en Claves y restricciones y mira más conceptos en el Glosario SQL completo.

Scroll al inicio