Em 15/10/08, Leandro DUTRA<[EMAIL PROTECTED]> escreveu:
> 2008/10/15 Rafael Sousa <[EMAIL PROTECTED]>:
>>
>> esse exemplo tá ficando cada vez melhor.. :-)
>
> Já que houve aplausos, dá para melhorar mais ainda — não exatamente
> modelagem mas nomenclatura.
>
> O tipo deve ter o mesmo nome que será usado no atributo... na verdade,
> o nome do atributo deve ser o do tipo, a menos que o mesmo tipo seja
> usado mais de uma vez na mesma relação.  Se não me falha a memória,
> essa regrinha prática já consta dos primeiros artigos do Codd.  E uma
> vez que o nome correto é Unidade da Federação, não Estado (o DF não é
> um Estado):
>
> CREATE TYPE uf AS ENUM('SP','MG','RJ');
>
> CREATE TABLE uf
> (
>   uf uf
>   CONSTRAINT uf_pk PRIMARY KEY
> )
>
> insert into uf values('SP')
> OK
>
> insert into teste values('SJ')
> valor de entrada e invalido para enum uf: "SJ"
>
> select enumlabel from pg_enum
>
> enumlabel name
> "SP"
> [...]
>
> Uma coisa que estou achando um pouco chato no ENUM é que é uma lista
> de seqüências de caracteres, na verdade.  Seria legal algo assim com
> maior flexibilidade dos tipos básicos usados para derivação.
>


Outra característica do enum é que a ordem é determinada pela ordem em
que são colocados no comando de sua criação. Assim:

bdteste=# CREATE TYPE paises AS ENUM('BR','PT','FR','US','JP');
CREATE TYPE

bdteste=# CREATE TEMP TABLE teste(
bdteste(#   id    serial PRIMARY KEY,
bdteste(#   pais  paises,
bdteste(#   foo   text);
NOTA:  CREATE TABLE criará sequência implícita "teste_id_seq" para
coluna serial "teste.id"
NOTA:  CREATE TABLE / PRIMARY KEY criará índice implícito "teste_pkey"
na tabela "teste"
CREATE TABLE
bdteste=#
bdteste=# INSERT INTO teste VALUES(default, 'BR', 'a');
INSERT 0 1
bdteste=# INSERT INTO teste VALUES(default, 'FR', 'b');
INSERT 0 1
bdteste=# INSERT INTO teste VALUES(default, 'JP', 'b');
INSERT 0 1
bdteste=# INSERT INTO teste VALUES(default, 'PT', 'a');
INSERT 0 1
bdteste=# INSERT INTO teste VALUES(default, 'NE', 'c');
ERRO:  valor de entrada é inválido para enum paises: "NE"
bdteste=#
bdteste=# SELECT * FROM teste;
 id | pais | foo
----+------+-----
  1 | BR   | a
  2 | FR   | b
  3 | JP   | b
  4 | PT   | a
(4 registros)

bdteste=# SELECT * FROM teste WHERE pais > 'PT';
 id | pais | foo
----+------+-----
  2 | FR   | b
  3 | JP   | b
(2 registros)

Verifique que o PostgreSQL considera a ordem de criação do tipo:

bdteste=# SELECT pe.enumlabel AS pais FROM pg_type pt JOIN pg_enum pe
ON pt.oid = pe.enumtypid WHERE pt.typname = 'paises';
 pais
------
 BR
 PT
 FR
 US
 JP
(5 registros)

Se no lugar do enum tivessemos criado uma tabela auxiliar, com uma
chave estrangeira,  o resultado seria diferente.

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a