← Voltar ao hub MariaDB
MariaDB 22 de outubro de 2026 5 min de leitura

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.

MariaDB: períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito

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

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).