Olá,

se você deseja criar chaves primárias seriais no POSTGRES, a estrutura
recomendada abaixo deverá ser utilizada:

*create table pessoa (
 id serial primary key,
 nome varchar,
 datanasc date
);

create table profissao(
 id serial primary key,
 id_pessoa integer not null references pessoa,
 descricao varchar
);*

neste caso, o campo serial é um ALIAS que criará uma "sequence" de auto
incremento como uma chave primária e com a constraint automaticamente
nomeada como "pessoa_id_seq", então você poderá fazer inserts da seguinte
forma:

*insert into pessoa(nome, datanasc) values ('bob esponja', '1981-06-12');*

caso você esteja usando o POSTGRES *8.3* ou superior (não funciona nas
versões anteriores, atualize seu BD), o comando abaixo retornará o último id
inserido:

*insert into pessoa(nome, datanasc) values ('lula molusco', '1981-03-21')
returning id;*

caso você deseje utilizar o último id inserido numa *transação* em conjunto
com outras tabelas, você poderá usar os seguintes comandos (funciona em
versões do POSTGRES menores ou superiores ao 8.3):

*begin;
insert into pessoa(nome, datanasc) values ('patrick estrela', '1981-03-23');
insert into profissao(id_pessoa, descricao) values ((select last_value from
pessoa_id_seq), 'analista de sistemas');
commit;*

também é possível manipular os valores da sequence fazendo comandos assim:

*select nextval('pessoa_id_seq'); --vai incrementar a id + 1 da sequence
select curval('**pessoa_id_seq'); --vai retornar a última id inserida na
sequence informada
select setval('**pessoa_id_seq', 100); --vai configurar próximo valor da
sequence = 101
**select setval('**pessoa_id_seq', 200, false); --vai configurar próximo
valor da sequence = 200*

espero que as dicas tenham ajudado em alguma coisa.

[]'s
Daniel Falcão

Em 21 de julho de 2011 21:48, Vinicius Santos <
[email protected]> escreveu:

> Em 21/07/2011 21:13, Leandro DUTRA escreveu:
> > upondo que a chave primária seja um serial, certo?  Caso em que
> > espero que te lembres de declarar também ao menos uma chave natural.
> Me tire uma dúvida, por favor.
>
> Eu acompanhei toda a grande discusão envolto deste assunto.
>
> Vamos supor que tenho uma tabela chamada CORES, com milhões de
> registros, na qual a chave primária é um serial, e tenho outra coluna
> chamada "descricao_cor"( que seria a chave natural, neste exemplo ).
>
> Então eu utilizo um "UNIQUE INDEX" ou simplesmente um "UNIQUE" para
> declarar a coluna "descricao_cor", como chave natural. Isso estaria certo ?
>
> Minha dúvida é a seguinte: Qual a melhor forma de promover as chaves
> naturais em PostgreSQL ??
>
> Usar serial como chave primária na maioria dos casos, e colocar um
> UNIQUE ou UNIQUE INDEX na chave natural, como no exemplo das cores ?
>
> Ou o melhor( inclusive pensando em performance ), seria simplesmente
> declarar:
> CREATE TABLE cores(
>   descricao_cor VARCHAR(30) NOT NULL PRIMARY KEY
> );  ??
>
> Considerando que a tabela tenha vários relacionamentos.
>
> Como vocês fazem ?
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
Atenciosamente,
Daniel Falcão

Analista e Desenvolvedor de Software
http://br.linkedin.com/in/embuar
http://lattes.cnpq.br/2208735579737258
http://embuar.blogspot.com
http://twitter.com/embuar
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a