Constraints en SQL: restricciones esenciales

Constraints en SQL: restricciones esenciales

Las constraints en SQL son reglas que el motor verifica al insertar o modificar datos. Permiten impedir correos duplicados, pedidos sin cliente, precios negativos y campos obligatorios vacíos antes de que el error llegue a un informe.

La integridad funciona mejor cerca del dato. Una validación de formulario mejora la experiencia, pero puede ser omitida por otra aplicación, una importación o una consulta manual. La restricción de base se aplica a todos los caminos.

NOT NULL

Obliga a que una columna tenga valor:

CREATE TABLE clientes (
  cliente_id BIGINT NOT NULL,
  email VARCHAR(255) NOT NULL
);

NOT NULL no impide una cadena vacía ni un texto con espacios. Si esos valores son inválidos, añade una regla adicional o normaliza la entrada.

UNIQUE

Evita valores repetidos:

ALTER TABLE clientes
ADD CONSTRAINT uq_clientes_email UNIQUE (email);

El tratamiento de varios NULL puede variar por motor. Además, Ana@ejemplo.com y ana@ejemplo.com podrían considerarse iguales o diferentes según comparación y collation. Define primero la regla de negocio.

Una restricción compuesta protege combinaciones:

UNIQUE (pais, numero_documento)

PRIMARY KEY

La clave primaria identifica de forma única cada fila y no admite nulos:

CREATE TABLE productos (
  producto_id BIGINT PRIMARY KEY,
  nombre VARCHAR(200) NOT NULL
);

Cada tabla tiene una clave primaria, aunque puede contener varias columnas. Elige un identificador estable; un dato que cambia, como correo o teléfono, suele ser mala clave.

FOREIGN KEY

La clave foránea exige que el valor exista en la tabla referenciada:

CREATE TABLE pedidos (
  pedido_id BIGINT PRIMARY KEY,
  cliente_id BIGINT NOT NULL,
  CONSTRAINT fk_pedidos_cliente
    FOREIGN KEY (cliente_id)
    REFERENCES clientes(cliente_id)
);

También debes decidir qué ocurre al borrar o actualizar la fila padre: RESTRICT, NO ACTION, CASCADE o SET NULL, según soporte. CASCADE es útil cuando la dependencia es inseparable, pero peligroso si puede borrar un grafo amplio sin revisión.

La guía de clave primaria y foránea desarrolla estas relaciones.

CHECK

CREATE TABLE productos (
  producto_id BIGINT PRIMARY KEY,
  precio DECIMAL(12,2) NOT NULL,
  stock INTEGER NOT NULL,
  CONSTRAINT ck_producto_precio CHECK (precio >= 0),
  CONSTRAINT ck_producto_stock CHECK (stock >= 0)
);

CHECK expresa reglas por fila. Recuerda la lógica de tres valores: una expresión desconocida por NULL puede no fallar. Combínala con NOT NULL cuando el dato sea obligatorio.

DEFAULT

estado VARCHAR(20) NOT NULL DEFAULT 'pendiente'

DEFAULT se aplica cuando la inserción omite la columna; no siempre reemplaza un NULL explícito. Tampoco valida que el valor predeterminado sea correcto para todo flujo.

Añadir restricciones a tablas con datos

Antes de activar una regla sobre datos históricos:

  1. Perfilas nulos, duplicados y valores fuera de rango.
  2. Defines cómo corregir cada caso.
  3. Creas respaldo o plan reversible.
  4. Limpias por lotes.
  5. Añades la restricción.
  6. Verificas aplicaciones y cargas.
  7. Monitorizas nuevos rechazos.

Intentar una restricción sin limpiar puede bloquear el despliegue. Algunos motores permiten crearla sin validar todo el histórico y validarla después; documenta ese estado temporal.

Constraints y transacciones

Una restricción puede evaluarse inmediatamente o, en ciertos motores, diferirse hasta COMMIT. Esto afecta operaciones que temporalmente violan una relación durante una reorganización.

Usa transacciones para que una migración completa se confirme o se revierta. No desactives restricciones de forma global sin controlar quién puede escribir durante la ventana.

Restricción frente a índice

Una PRIMARY KEY o UNIQUE suele apoyarse en un índice, pero los conceptos no son idénticos: la constraint declara una regla de integridad; el índice es una estructura de acceso. Crea reglas por corrección y analiza índices por consultas y costo de escritura.

Nombres y mensajes

Nombra restricciones con un patrón como pk_tabla, fk_hija_padre, uq_tabla_columnas y ck_tabla_regla. Un nombre explícito facilita migraciones, alertas y diagnóstico.

Errores frecuentes

  • Confiar solo en validación de la aplicación.
  • Usar un dato mutable como clave primaria.
  • Crear UNIQUE sin normalizar mayúsculas o espacios.
  • Aplicar CASCADE sin analizar el alcance.
  • Creer que CHECK rechaza NULL automáticamente.
  • Añadir una regla sin limpiar el histórico.
  • Deshabilitar constraints para acelerar cargas sin validación posterior.
  • Duplicar reglas contradictorias en varios sistemas.

Las restricciones no sustituyen pruebas ni monitoreo, pero convierten supuestos críticos en garantías ejecutables.

Preguntas frecuentes

¿Qué es una constraint en SQL?
Es una regla declarada en el esquema que el motor verifica para preservar la integridad de los datos.

¿Cuáles son las restricciones principales?
NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK y DEFAULT cubren obligatoriedad, unicidad, relaciones y dominios básicos.

¿UNIQUE permite valores NULL?
Depende del motor y su semántica. Verifica el comportamiento si la regla de negocio exige como máximo un nulo.

¿CHECK reemplaza NOT NULL?
No necesariamente. Por la lógica de NULL, una condición CHECK desconocida puede aceptarse; combina ambas cuando el campo sea obligatorio.

¿FOREIGN KEY hace más lentas las escrituras?
Añade verificación y requiere índices adecuados, pero aporta integridad. Evalúa rendimiento sin sacrificar silenciosamente la regla.

¿DEFAULT se usa cuando envío NULL?
Habitualmente se aplica al omitir la columna, no al enviar NULL explícito. Confirma el comportamiento del motor.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir