Há alguns anos, usando o MySQL/MariaDB, tive a oportunidade de empregar o tipo enumerado (enum), que segundo a documentação, é um objeto de string com um valor escolhido a partir de uma lista predefinida. Segue como exemplo uma tabela de pedidos com uma lista fixa de status:
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
status ENUM('pendente', 'processando', 'enviado', 'entregue') DEFAULT 'pendente'
);
No PostgreSQL, diferentemente do MySQL/MariaDB, é necessário criar o “tipo enum” da seguinte maneira:
CREATE TYPE status_pedido AS ENUM ('pendente', 'processando', 'enviado', 'entregue');
CREATE TABLE pedidos (
id SERIAL PRIMARY KEY,
status status_pedido
);
O tipo enumerado é o ideal para conjunto de dados que dificilmente mudarão, como:
Embora os tipos enum sejam destinados principalmente a conjuntos estáticos de valores, há suporte para adicionar novos valores a um tipo enum existente e para renomear valores (consulte ALTER TYPE). Os valores existentes não podem ser removidos de um tipo enum, nem a ordem de classificação desses valores pode ser alterada, a menos que o tipo enum seja descartado e recriado.
Exemplos:
ALTER TYPE status_pedido ADD VALUE 'cancelado' AFTER 'entregue';
ALTER TYPE status_pedido RENAME VALUE 'pago' TO 'confirmado';
MySQL :: MySQL 9.6 Reference Manual :: 13.3.6 The ENUM Type. Disponível em: https://dev.mysql.com/doc/refman/9.6/en/enum.html. Acesso em: 4 abr. 2026.
8.7. Enumerated Types. Disponível em: https://www.postgresql.org/docs/current/datatype-enum.html. Acesso em: 4 abr. 2026.