52.20. pg_enum #

O catálogo pg_enum contém entradas que mostram os valores e rótulos para cada tipo de dados enum. A representação interna de um determinado valor enum é, na verdade, o OID de sua linha associada em pg_enum.

Tabela 52.20. Colunas de pg_enum

Coluna Tipo de dados

Descrição

oid oid

Identificador da linha

enumtypid oid (referencia pg_type.oid)

O OID da entrada em pg_type à qual pertence este valor de enumeração

enumsortorder float4

A posição de classificação desse valor enum dentro de seu tipo de dados enum

enumlabel name

O rótulo textual para este valor enum


Os OIDs das linhas de pg_enum seguem uma regra especial: é garantido que os OIDs pares sejam classificados da mesma maneira que a ordem de classificação de seu tipo de dados enum. Ou seja, se dois OIDs pares pertencerem ao mesmo tipo de dados enum, o OID menor deverá ter o valor de enumsortorder menor. Os valores OID ímpares não precisam ter relação com a ordem de classificação. Esta regra permite que as rotinas de comparação de enum evitem procuras no catálogo em muitos casos comuns. As rotinas que criam e modificam tipos de dados enum tentam atribuir OIDs pares a valores de enum sempre que possível.

Quando é criado um tipo de dados enum, seus membros recebem posições de ordem de classificação 1..n. Mas os membros adicionados posteriormente podem receber valores negativos ou fracionários para enumsortorder. O único requisito para estes valores é que sejam ordenados corretamente e sejam únicos em cada tipo de dados enum.

Exemplo 52.12. Exemplo do tradutor

Tipo de dados enum

Uso do catálogo pg_enum para mostrar informações relacionadas ao tipo de dados arco_iris, e uso também do meta-comando \dTx+ arco_iris do psql para mostrar esta informações. Note que os valores dos OIDs são pares.

ana=> CREATE TYPE arco_iris AS ENUM
ana-> ('vermelho', 'laranja', 'amarelo',
ana(> 'verde', 'azul', 'anil', 'violeta');
CREATE TYPE
ana=> COMMENT ON TYPE arco_iris IS 'Cores do arco-iris';
COMMENT
ana=> SELECT e.oid AS "OID",
ana-> p.typname AS "Nome do tipo",
ana-> e.enumsortorder AS "Ordem",
ana-> e.enumlabel AS "Elemento"
ana-> FROM pg_enum e
ana-> LEFT JOIN pg_type p ON e.enumtypid = p.oid
ana-> ORDER BY "Nome do tipo", "Ordem";

  OID   | Nome do tipo | Ordem | Elemento
--------+--------------+-------+----------
 117212 | arco_iris    |     1 | vermelho
 117214 | arco_iris    |     2 | laranja
 117216 | arco_iris    |     3 | amarelo
 117218 | arco_iris    |     4 | verde
 117220 | arco_iris    |     5 | azul
 117222 | arco_iris    |     6 | anil
 117224 | arco_iris    |     7 | violeta
(7 linhas)

ana=> \dTx+ arco_iris

Lista de tipos de dados
-[ RECORD 1 ]---------+-------------------
Esquema               | public
Nome                  | arco_iris
Nome interno          | arco_iris
Tamanho               | 4
Elementos             | vermelho          +
                      | laranja           +
                      | amarelo           +
                      | verde             +
                      | azul              +
                      | anil              +
                      | violeta
Dono                  | ana
Privilégios de acesso |
Descrição             | Cores do arco-iris


52.20.1. Veja também #

CREATE TYPE, ALTER TYPE, DROP TYPE, user_defined_types