O PostgreSQL garante a integridade dos dados através de — regras sobre os dados da tabela. Além das padrões (, , , , , ), o Postgres adiciona opções poderosas como constraints e expressões flexíveis.
O PostgreSQL garante a integridade dos dados através de — regras sobre os dados da tabela. Além das padrões (, , , , , ), o Postgres adiciona opções poderosas como constraints e expressões flexíveis.
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
Os constraints CHECK do Postgres podem enforçar regras de negócio ricas, incluindo condições entre colunas e padrões 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
Constraints EXCLUDE (um recurso específico do Postgres) impedem linhas que conflitem por um operador customizado — famosamente, prevenindo intervalos de tempo sobrepostos (double-bookings), o que um constraint UNIQUE não consegue fazer.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Constraints são essenciais para a integridade dos dados — eles enforçam regras de dados no nível do banco de dados (a última linha de defesa, sempre enforçada independentemente do código da aplicação), por isso entender o suporte de constraints do PostgreSQL é importante para projetar bancos de dados robustos.
Conhecer os constraints padrões (PRIMARY KEY, FOREIGN KEY com integridade referencial, UNIQUE, NOT NULL, CHECK, DEFAULT) e o que cada um enforça é fundamental para o design de schema, fornecendo garantias no nível do banco de dados (unicidade, referências válidas, valores obrigatórios, dados válidos) que protegem contra bugs, condições de corrida e dados inconsistentes de forma que o código da aplicação sozinho não consegue.
Os constraints CHECK do PostgreSQL são particularmente capazes, enforçando regras de negócio ricas incluindo condições entre colunas (consistência lógica como end_date > start_date) e até padrões regex — permitindo codificar regras de domínio diretamente no schema.
Especialmente valioso é o constraint EXCLUDE específico do Postgres, que impede linhas conflitantes por operadores customizados — notavelmente prevenindo intervalos de tempo sobrepostos (double-bookings para uma sala/recurso), uma capacidade poderosa que um constraint UNIQUE padrão não consegue fornecer e que elegantemente resolve um problema comum do mundo real (agendamento, reservas) no nível do banco de dados.
Entender os constraints — os padrões para integridade, as expressões CHECK flexíveis do Postgres, e o poderoso EXCLUDE para prevenção de conflitos — é importante para projetar bancos de dados que enforçam correção automaticamente.
Como a integridade dos dados é crítica e constraints fornecem garantias que o código da aplicação não consegue, e como o Postgres oferece opções poderosas (rich CHECK, EXCLUDE para sobreposições) além do básico, entender o suporte de constraints do PostgreSQL é conhecimento valioso e praticamente relevante para construir bancos de dados robustos, sendo o constraint EXCLUDE em particular uma capacidade distintiva e útil do Postgres que vale a pena conhecer para sistemas de agendamento/reservas.