2012/9/3 Eduardo Az - EMBRASIS <[email protected]>

>   Pessoal
>
> Imaginem as seguintes tabelas hipotéticas:
>
> CREATE TABLE cadastro
> (
>   id serial NOT NULL,
>   nome character varying(30) NOT NULL,
>   nasc_dt date,
>   CONSTRAINT cadastro_pkey PRIMARY KEY (id ),
> );
>
> CREATE TABLE cadastro_obs
> (
>   cadastro integer NOT NULL,
>   obs character varying(70),
>   CONSTRAINT cadastro_obs_pkey PRIMARY KEY (cadastro ),
>   CONSTRAINT cadastro_obs_cadastro_fkey FOREIGN KEY (cadastro)
>       REFERENCES cadastro (id) MATCH SIMPLE
>       ON UPDATE CASCADE ON DELETE CASCADE
> );
>
> Estou querendo criar uma function para inserir estes dados no banco.
>
> Criar a função pensando somente na primeira tabela, ok.
> Agora, tenho duas tabelas relacionadas. tentei usar o NEW. na segunda
> tabela para “pegar” o código serial gerado na primeira, mas, não tive
> sucesso.
>
> Como seria neste caso? Não encontrei documentação sobre isto.
>
> OBS: esta tabela é um exemplo.
>
>

Cara, você está com um problema que acho bem comum.

Mas não há "uma" solução. Primeiro, estude sobre sequences, e saiba que um
tipo serial usa sequence. Com sequences, você tem então as alternativas:
 * chamar a nextval e armazenar o valor em uma variável (pode ser retorno
da função de inserção, por exemplo);
 * usar a cláusula RETURNING junto com o INSERT INTO (eu gosto mais dessa);
 * usar o currval (saiba que ela retorna por sessão, ou seja, retorna o
último valor gerado na SUA sessão e não no geral, portanto é segura).

Acho que são essas. Se possível você pode usar chaves naturais, procure no
histórico da lista, tem discussões imensas sobre o assunto.

Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a