CodeGym /Cursos /SQL SELF /Trabajando con la restricción CHECK para va...

Trabajando con la restricción CHECK para validar datos

SQL SELF
Nivel 17, Lección 3
Disponible

La restricción CHECK es, en cierto modo, como un portero en la entrada de tu tabla. Garantiza que los datos que añades a la tabla cumplen ciertas condiciones. Si intentas meter datos que rompen esas condiciones, la base de datos no los va a aceptar.

Imagínate que quieres abrir una tienda en Alemania. Pero por ley, el domingo es día libre y está prohibido vender ese día. Esa restricción es como un CHECK en la base de datos. Intentas poner el horario de la tienda: abierto 7 días a la semana, pero el sistema te responde enseguida: "Nein, nein, domingo — eso es una violación. Ese horario no pasa la validación!"

Así pasa en la base de datos: si pones un valor que rompe la regla del CHECK, el sistema lo bloquea para que no metas un "error lógico" en los datos.

¿Para qué sirve CHECK?

  1. Mantener la calidad de los datos: CHECK evita que entre información incorrecta o que no tenga sentido en la tabla.
  2. Reducir la probabilidad de errores: en vez de comprobar los datos a mano antes de insertarlos, puedes dejarle esa tarea a la base de datos.
  3. Lógica autónoma: las reglas de validación pueden estar dentro de la estructura de la base de datos, no tienes que ponerlas en el código de la aplicación.

¿Cómo funciona CHECK?

La restricción CHECK se define al crear la tabla o se puede añadir después usando el comando ALTER TABLE. Aquí tienes la sintaxis básica:

CREATE TABLE tabla (
    columna tipo_de_dato CHECK (condición)
);

condición es una expresión lógica que debe cumplirse para cada valor en esa columna. Si la condición se rompe, la base de datos lanza un error.

Ejemplo 1: Comprobando un rango de valores

Vamos a crear una tabla students, donde la edad de los estudiantes (age) tiene que estar entre 16 y 100:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age >= 16 AND age <= 100)
);

Ahora, si intentas insertar un estudiante con edad 12, la base de datos te "pilla al vuelo":

INSERT INTO students (name, age)
VALUES ('Maria Chi', 12);

Error:

ERROR:  new row for relation "students" violates check constraint "students_age_check"
DETAIL:  Failing row contains (1, Maria Chi, 12).

Sí, la base de datos aquí es un portero estricto. Si no tienes 16, ni lo intentes.

Ejemplo 2: Comprobando el formato de los datos

Supón que tienes una tabla emails donde guardas una lista de direcciones de correo electrónico. Queremos asegurarnos de que las direcciones tengan el símbolo @ (es una comprobación sencilla):

CREATE TABLE emails (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) CHECK (email LIKE '%@%')
);

Vamos a intentar añadir una dirección incorrecta que no cumple la condición:

INSERT INTO emails (email)
VALUES ('notanemail.com');

Error:

ERROR:  new row for relation "emails" violates check constraint "emails_email_check"
DETAIL:  Failing row contains (1, notanemail.com).

El error se puede evitar si todos los datos tienen el símbolo @:

INSERT INTO emails (email) 
VALUES ('example@student.com');

La consulta se ejecuta sin problemas.

Ejemplo 3: Comprobando condiciones entre varias columnas

Las restricciones CHECK pueden validar no solo una columna, sino una expresión lógica que involucra varias columnas. Mira este ejemplo con la tabla employees, donde el salario (salary) tiene que ser mayor que los bonus (bonus):

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    salary NUMERIC CHECK (salary > 0),
    bonus NUMERIC CHECK (bonus >= 0),
    CHECK (salary > bonus)
);

Ahora, si alguien intenta añadir un empleado cuyo bonus es mayor que el salario, la base de datos no lo va a permitir:

INSERT INTO employees (name, salary, bonus)
VALUES ('Otto Lin', 3000, 4000);

Error:

ERROR:  new row for relation "employees" violates check constraint "employees_salary_bonus_check"
DETAIL:  Failing row contains (1, Otto Lin, 3000, 4000).

Aplicaciones prácticas

La restricción CHECK es útil cuando tu lógica de negocio está muy ligada a restricciones sobre los datos. Por ejemplo:

  1. Tiendas online: prohibir añadir productos con precio negativo.
  2. Plataformas educativas: comprobar la edad de los participantes en los cursos.
  3. Sistemas médicos: asegurarse de que la temperatura corporal del paciente está dentro de los límites permitidos.

Estas comprobaciones no son solo una capa extra de seguridad, también ahorran tiempo y dolores de cabeza a desarrolladores y usuarios.

Características y errores típicos

Cuando trabajes con CHECK, ten en cuenta lo siguiente:

  • Las expresiones lógicas en CHECK tienen que ser verdaderas para todas las filas de la tabla. Si alguna fila rompe la regla, antes de añadir la restricción tienes que corregir esa fila.

  • La comprobación no se hace si el valor insertado es NULL. O sea, CHECK (age >= 18) no dará error para age = NULL. Esto es porque cualquier expresión que incluya NULL se vuelve indefinida. Si quieres prohibir NULL, añade NOT NULL.

  • Condiciones complejas en CHECK pueden afectar el rendimiento al insertar o actualizar datos, sobre todo en tablas grandes.

2
Tarea
SQL SELF, nivel 17, lección 3
Bloqueada
Comprobación de rango de valores usando `CHECK`
Comprobación de rango de valores usando `CHECK`
2
Tarea
SQL SELF, nivel 17, lección 3
Bloqueada
Comprobación de condiciones para varias columnas
Comprobación de condiciones para varias columnas
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION