8.7. Tipos de dados de enumeração #

8.7.1. Declaração dos tipos de dados enum
8.7.2. Ordem de classificação
8.7.3. Segurança do tipo de dados
8.7.4. Detalhes de implementação

Os tipos de dados enum (enumeração) são tipos de dados que compreendem um conjunto estático e ordenado de valores. São equivalentes aos tipos de dados enum encontrados em muitas linguagens de programação [47]. Exemplos de tipo de dados enum podem ser os dias da semana, os meses do ano, ou um conjunto de valores de estado para um dado.

8.7.1. Declaração dos tipos de dados enum #

Os tipos de dados enum são criados usando o comando CREATE TYPE, como:

CREATE TYPE ânimo AS ENUM ('triste', 'normal', 'feliz');

Uma vez criado, o tipo de dados enum pode ser usado em definições de tabela e função como qualquer outro tipo de dados:

CREATE TABLE pessoas (
    nome text,
    ânimo_atual ânimo
);

INSERT INTO pessoas VALUES ('Moe', 'feliz');

SELECT * FROM pessoas WHERE ânimo_atual = 'feliz';

 nome | ânimo_atual
------+-------------
 Moe  | feliz
(1 linha)

8.7.2. Ordem de classificação #

A ordem de classificação dos valores do tipo de dados enum é a ordem na qual os valores foram listados quando o tipo de dados foi criado. Todos os operadores de comparação e funções de agregação relacionadas são compatíveis com o tipo de dados enum. Por exemplo:

INSERT INTO pessoas VALUES ('Larry', 'triste');
INSERT INTO pessoas VALUES ('Curly', 'normal');

SELECT *
    FROM pessoas
    WHERE ânimo_atual > 'triste';

 nome  | ânimo_atual
-------+-------------
 Moe   | feliz
 Curly | normal
(2 linhas)

SELECT *
    FROM pessoas
    WHERE ânimo_atual > 'triste'
    ORDER BY ânimo_atual;

 nome  | ânimo_atual
-------+-------------
 Curly | normal
 Moe   | feliz
(2 linhas)

SELECT nome
FROM pessoas
WHERE ânimo_atual = (SELECT MIN(ânimo_atual) FROM pessoas);

 nome
-------
 Larry
(1 linha)

8.7.3. Segurança do tipo de dados #

Cada tipo de dados enum é separado, não podendo ser comparado com outros tipos de dados enum. Veja o seguinte exemplo:

CREATE TYPE felicidade AS ENUM ('feliz', 'muito feliz', 'em êxtase');
CREATE TABLE férias (
    num_semanas integer,
    felicidade felicidade
);
INSERT INTO férias(num_semanas,felicidade) VALUES (4, 'feliz');
INSERT INTO férias(num_semanas,felicidade) VALUES (6, 'muito feliz');
INSERT INTO férias(num_semanas,felicidade) VALUES (8, 'em êxtase');
INSERT INTO férias(num_semanas,felicidade) VALUES (2, 'desanimado');
ERRO:  valor de entrada inválido para enum felicidade: "desanimado"
SELECT pessoas.nome, férias.num_semanas FROM pessoas, férias
  WHERE pessoas.ânimo_atual = férias.felicidade;
ERRO:  operador não existe: "ânimo" = felicidade

Se realmente for necessário fazer algo assim, pode ser escrito um operador personalizado ou adicionadas conversões explícitas à consulta:

SELECT pessoas.nome, férias.num_semanas FROM pessoas, férias
  WHERE pessoas.ânimo_atual::text = férias.felicidade::text;

 nome | num_semanas
------+-------------
 Moe  |           4
(1 linha)

8.7.4. Detalhes de implementação #

Os rótulos da enumeração diferenciam letras maiúsculas de minúsculas, portanto 'feliz' não é idêntico a 'FELIZ'. Os espaços em branco também têm significado.

Embora os tipos de dados enum se destinem, principalmente, a conjuntos de valores estáticos, há suporte para adicionar novos valores a um tipo de dados enum existente, e para mudar o nome dos valores (veja ALTER TYPE). Os valores existentes em um tipo de dados enum não podem ser removidos, nem a ordem de classificação destes valores pode ser alterada, a não ser excluindo e recriando o tipo de dados enum.

O valor enum ocupa quatro bytes no disco. O comprimento do rótulo textual de um valor enum está limitado pela definição de NAMEDATALEN compilada no PostgreSQL; nas construções padrão isto significa um máximo de 63 bytes.

As traduções dos valores internos de enumeração para rótulos textuais são mantidas no catálogo do sistema (Seção 52.20). Consultar este catálogo diretamente pode ser útil.

Exemplo 8.12. Exemplo do tradutor

Consulta aos catálogos do sistema pg_enum e pg_type.

SELECT t.typname, e.enumsortorder, e.enumlabel
FROM pg_enum e, pg_type t
WHERE e.enumtypid = t.oid
ORDER BY t.typname, e.enumsortorder;

  typname   | enumsortorder |  enumlabel
------------+---------------+-------------
 felicidade |             1 | feliz
 felicidade |             2 | muito feliz
 felicidade |             3 | em êxtase
 ânimo      |             1 | triste
 ânimo      |             2 | normal
 ânimo      |             3 | feliz
(6 linhas)




[47] Na linguagem C, enumeração (ou enum) é um tipo de dados definido pelo usuário que contém um conjunto com nome próprio de constantes inteiras. É usado para atribuir nomes significativos a valores inteiros, tornando o programa fácil de ler e manter. Fonte: Enumeration (or enum) in C