MariaDB: períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito
O MariaDB entende intervalos de tempo de negócio: impede reservas sobrepostas direto na chave única e atualiza só um pedaço de um período.

Toda equipe que já fez sistema de reservas tem uma cicatriz: duas pessoas no mesmo quarto, na mesma noite. A validação estava na aplicação... e a aplicação tinha duas instâncias.
Este artigo faz parte da série MariaDB além do MySQL: dez recursos que existem no MariaDB e não existem no MySQL Community. Exemplos escritos para MariaDB 11.4 LTS (e 11.7+ quando indicado), comparados com MySQL 8.4 LTS.
O que são períodos de aplicação?
Se o System Versioning registra quando o banco soube de algo, o período de aplicação registra quando aquilo vale no mundo real: a vigência de um contrato, a validade de um preço, a estadia de um hóspede. O MariaDB suporta isso desde a 10.4, e a 10.5 trouxe a cereja: WITHOUT OVERLAPS.
Quarto 101
Reserva A |=====01/11────05/11=====|
Reserva B |====04/11────08/11====| ✗ sobreposição → erro de chave duplicada
Reserva C |05/11────07/11| ✓ começa quando A termina
Na prática
CREATE TABLE reservas (
quarto INT,
hospede VARCHAR(100),
entrada DATE,
saida DATE,
PERIOD FOR estadia (entrada, saida),
UNIQUE (quarto, estadia WITHOUT OVERLAPS)
);
INSERT INTO reservas VALUES (101, 'Ana', '2026-11-01', '2026-11-05');
INSERT INTO reservas VALUES (101, 'Bruno', '2026-11-04', '2026-11-08');
-- ERROR 1062: Duplicate entry '101-2026-11-08-2026-11-04' for key 'quarto'
INSERT INTO reservas VALUES (101, 'Carla', '2026-11-05', '2026-11-07'); -- OK
O período é fechado no início e aberto no fim: sair dia 5 e outro entrar dia 5 não conflita.
Atualizando só um pedaço do período
CREATE TABLE precos (
produto INT,
valor DECIMAL(10,2),
inicio DATE,
fim DATE,
PERIOD FOR vigencia (inicio, fim)
);
INSERT INTO precos VALUES (1, 50.00, '2026-01-01', '2027-01-01');
-- Promoção só em novembro
UPDATE precos FOR PORTION OF vigencia FROM '2026-11-01' TO '2026-12-01'
SET valor = 39.90 WHERE produto = 1;
O MariaDB divide a linha sozinho em três: jan–out a 50, novembro a 39,90 e dezembro a 50. DELETE ... FOR PORTION OF funciona do mesmo jeito.
E no MySQL?
O MySQL 8.4 não tem PERIOD FOR, nem FOR PORTION OF, nem WITHOUT OVERLAPS. A proteção contra sobreposição fica em trigger com SELECT ... FOR UPDATE ou na aplicação, e ambas exigem cuidado com concorrência.
Quando usar
- Reservas (hotel, salas, equipamentos, agenda médica).
- Vigência de preços, tarifas e contratos.
- Alocação de pessoas em projetos ou plantões.
Dá para combinar com System Versioning na mesma tabela: é a chamada tabela bitemporal.
A série completa: MariaDB além do MySQL
- Tabelas temporais (System Versioning) para viajar no tempo dos dados
- Períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito
- SEQUENCE, o gerador de números que o AUTO_INCREMENT não consegue ser
- INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas
- Modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor
- Multi-master síncrono que já vem na caixa
- Banco colunar para análise sem sair do SQL
- Sharding transparente com tabelas distribuídas
- Thread pool gratuito para milhares de conexões
- Busca vetorial com índice HNSW para IA e RAG
Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.
Quer dominar a base que os dois compartilham?
MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.
Conheça o livro e leia a degustação gratuita.
Bora trocar ideia?
Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.
Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.
Fontes: MariaDB Server Documentation (MariaDB Knowledge Base), notas de release do MariaDB Server, MySQL 8.4 Reference Manual. Imagem de capa: ilustração gerada por IA (mão colocando um cartão de reserva num quadro de calendário de hotel).