PostgreSQL refuerza la integridad de datos a través de restricciones — reglas sobre datos de tabla. Más allá de las estándar (, , , , , ), Postgres añade opciones potentes como restricciones y expresiones flexibles.
PostgreSQL refuerza la integridad de datos a través de restricciones — reglas sobre datos de tabla. Más allá de las estándar (, , , , , ), Postgres añade opciones potentes como restricciones y expresiones flexibles.
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
Las restricciones CHECK de Postgres pueden reforzar reglas de negocio ricas, incluyendo condiciones entre columnas y patrones regex.
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
Las restricciones EXCLUDE (una característica específica de Postgres) previenen filas que entran en conflicto por un operador personalizado — famosamente, previniendo rangos de tiempo superpuestos (doble reserva), lo que una restricción UNIQUE no puede hacer.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Las restricciones son esenciales para la integridad de datos — refuerzan reglas de datos al nivel de base de datos (la última línea de defensa, siempre reforzada independientemente del código de aplicación), así que entender el soporte de restricciones de PostgreSQL es importante para diseñar bases de datos robustas.
Conocer las restricciones estándar (PRIMARY KEY, FOREIGN KEY con integridad referencial, UNIQUE, NOT NULL, CHECK, DEFAULT) y qué refuerza cada una es fundamental para el diseño de esquemas, proporcionando garantías a nivel de base de datos (unicidad, referencias válidas, valores requeridos, datos válidos) que protegen contra errores, condiciones de carrera e inconsistencia de datos de formas que el código de aplicación solo no puede.
Las restricciones CHECK de PostgreSQL son particularmente capaces, reforzando reglas de negocio ricas incluyendo condiciones entre columnas (consistencia lógica como end_date > start_date) e incluso patrones regex — permitiéndote codificar reglas de dominio directamente en el esquema.
Especialmente valiosa es la restricción EXCLUDE específica de Postgres, que previene filas conflictivas por operadores personalizados — más notablemente previniendo rangos de tiempo superpuestos (doble reserva para una habitación/recurso), una capacidad potente que una restricción UNIQUE estándar no puede proporcionar y que elegantemente resuelve un problema común en el mundo real (programación, reservas) al nivel de base de datos.
Entender las restricciones — las estándar para integridad, las expresiones CHECK flexibles de Postgres, y EXCLUDE potente para prevención de conflictos — es importante para diseñar bases de datos que refuercen corrección automáticamente.
Ya que la integridad de datos es crítica y las restricciones proporcionan garantías que el código de aplicación no puede, y ya que Postgres ofrece opciones potentes (CHECK rico, EXCLUDE para solapamientos) más allá de lo básico, entender el soporte de restricciones de PostgreSQL es conocimiento valioso y prácticamente relevante para construir bases de datos robustas, siendo la restricción EXCLUDE en particular una capacidad distintiva y útil de Postgres que vale la pena conocer para sistemas de programación/reservas.