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