Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcelo Sabdini

Ultimo id inserido

Recommended Posts

Boa tarde pessoa,Esou com uma duvida aqui. Estou fazendo um insert legal, porem eu preciso saber qual foi o ulltimo id inserido. Estou usando:pg_last_oid(resource result)No meu caso o resource result é $this->dbResult, então estou usando assim: $ultimo = pg_last_oid($this->dbResult);Porém olha q locura... o ai q foi inserido(olhando direto na tabela é por exemplo 280) ele esta me retornando 541494.Alguem sabe se tem alguma outra forma ou se estou fazendo errado?Abraços..

Compartilhar este post


Link para o post
Compartilhar em outros sites

EH.. vou colocar um trecho maior do codigo:$this->dbResult = pg_query($this->dbConn, $this->dbSQL);//$this->dbSQL é o sql q é executado!!$ultimo = pg_last_oid($this->dbResult);ai retorna o numero q postei acima...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função pg_last_oid() não retorna o último "id" inserido na tabela.

 

Seu campo esta vinculado a um serial?

Você pode pegar o valor desta maneira:

select currval('serial_da_tabela')

Compartilhar este post


Link para o post
Compartilhar em outros sites

OID significa Object ID...

 

4.16) O que é um OID? O que é um CTID?

 

Cada registro que é criado no PostgreSQL recebe um OID único a menos que seja criado com WITHOUT OIDS. OIDs são automaticamente atribuídos como inteiros de 4 bytes que são únicos ao longo de toda instalação. Contudo, eles são limitados em 4 bilhões, e então os OIDs começam a ser duplicados. O PostgreSQL utiliza OIDs para ligar as tabelas do sistema.

 

Para numerar registros nas tabelas do usuários, é melhor utilizar SERIAL ao invés de OIDs porque sequências SERIAL são únicas somente em uma tabela; e são menos propícias a atingir o limite. SERIAL8 está disponível para armazenar valores de sequências com oito bytes.

 

CTIDs são utilizados para identificar registros físicos específicos com valores de block e deslocamento. CTIDs mudam após registros serem modificados ou recarregados. Eles são utilizados por índices para apontar registros físicos.

fonte: http://www.postgresql.org/docs/faqs.FAQ_brazilian.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

OID significa Object ID...

 

4.16) O que é um OID? O que é um CTID?

 

Cada registro que é criado no PostgreSQL recebe um OID único a menos que seja criado com WITHOUT OIDS. OIDs são automaticamente atribuídos como inteiros de 4 bytes que são únicos ao longo de toda instalação. Contudo, eles são limitados em 4 bilhões, e então os OIDs começam a ser duplicados. O PostgreSQL utiliza OIDs para ligar as tabelas do sistema.

 

Para numerar registros nas tabelas do usuários, é melhor utilizar SERIAL ao invés de OIDs porque sequências SERIAL são únicas somente em uma tabela; e são menos propícias a atingir o limite. SERIAL8 está disponível para armazenar valores de sequências com oito bytes.

 

CTIDs são utilizados para identificar registros físicos específicos com valores de block e deslocamento. CTIDs mudam após registros serem modificados ou recarregados. Eles são utilizados por índices para apontar registros físicos.

fonte: http://www.postgresql.org/docs/faqs.FAQ_brazilian.html

 

Entendi Prog, muito obrigado. Eu usei o SELECT currval... e obtive o resultado esperado.

 

Valeu a força :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

você estão falando de postgreSql ?Estou precisando retornar o ultimo registro inserido em uma tabela mas não consegui aplicar as dicas dadas acima ...desde já agradeço ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dae pessoal to tentando descobrir mesma coisa...

vcs podem até estar achando o resultado esperado, mas quando colocar em produção, se houver duas inserções em seqüência vcs perdem a integridade

 

Ou estou errado??

pesquisando vi essa forma aqui... ainda não implementei mas vou dar uma estudada...

http://www.criarweb.com/artigos/181.php

 

Mas to achando que por questões de segurança vou fazer um select sobre o que inseri e ponto final... menos surpresas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Djonatan,

 

O link que você passou trata de PHP e MySQL e não de PHP e Postgres.

 

Estou passando pela mesma situação, preciso fazer um insert no Postgres e em seguida obter o código da chave primária do registro de acabou de ser inserido.

 

A solução mais indicada que encontrei até agora é usando o RETURNING, por exemplo:

 

INSERT INTO produto (codigo, nome) VALUES (1000, 'Intel Core i7') RETURNING codigo;

O problema no meu caso é que o RETURNING está disponível apenas a partir da versão 8.2 do Postgres, mas minha hospedagem (Bounceweb) ainda roda o Postgres 8.1.

 

Depois do RETURNING a opção sobre a qual mais encontrei conteúdo foi usando o currval(), por exemplo:

 

SELECT currval('testanto_seq');

Minha preocupação neste caso é com relação a transações concorrentes, elas podem comprometer a integridade da informação, veja a simulação abaixo.

 

1) Usuário A: Faz um insert

2) Usuário B: Faz um insert

 

3) O sistema solicita via PHP o currval() para exibir a mensagem de confirmação para o usuário A e o Postgres vai retornar de forma errada o código do usuário B.

 

Encontrei esta informação no site oficial do Postgres, mas não consegui entender muito bem:

 

-------------------------------------------------------------------------------------------------------

currval

 

Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported

if nextval has never been called for this sequence in this session.) Because this is returning a session-local value, it

gives a predictable answer whether or not other sessions have executed nextval since the current session did.

-------------------------------------------------------------------------------------------------------

 

Alguém já passou pela mesma situação e conseguiu encontrar uma solução segura? Ficarei muito grato por qualquer ajuda.

 

Valeu!

 

 

 

 

Dae pessoal to tentando descobrir mesma coisa...

vcs podem até estar achando o resultado esperado, mas quando colocar em produção, se houver duas inserções em seqüência vcs perdem a integridade

 

Ou estou errado??

pesquisando vi essa forma aqui... ainda não implementei mas vou dar uma estudada...

http://www.criarweb.com/artigos/181.php

 

Mas to achando que por questões de segurança vou fazer um select sobre o que inseri e ponto final... menos surpresas...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Djonatan,

 

O link que você passou trata de PHP e MySQL e não de PHP e Postgres.

 

Estou passando pela mesma situação, preciso fazer um insert no Postgres e em seguida obter o código da chave primária do registro de acabou de ser inserido.

 

A solução mais indicada que encontrei até agora é usando o RETURNING, por exemplo:

 

INSERT INTO produto (codigo, nome) VALUES (1000, 'Intel Core i7') RETURNING codigo;

O problema no meu caso é que o RETURNING está disponível apenas a partir da versão 8.2 do Postgres, mas minha hospedagem (Bounceweb) ainda roda o Postgres 8.1.

 

Depois do RETURNING a opção sobre a qual mais encontrei conteúdo foi usando o currval(), por exemplo:

 

SELECT currval('testanto_seq');

Minha preocupação neste caso é com relação a transações concorrentes, elas podem comprometer a integridade da informação, veja a simulação abaixo.

 

1) Usuário A: Faz um insert

2) Usuário B: Faz um insert

 

3) O sistema solicita via PHP o currval() para exibir a mensagem de confirmação para o usuário A e o Postgres vai retornar de forma errada o código do usuário B.

 

Encontrei esta informação no site oficial do Postgres, mas não consegui entender muito bem:

 

-------------------------------------------------------------------------------------------------------

currval

 

Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported

if nextval has never been called for this sequence in this session.) Because this is returning a session-local value, it

gives a predictable answer whether or not other sessions have executed nextval since the current session did.

-------------------------------------------------------------------------------------------------------

 

Alguém já passou pela mesma situação e conseguiu encontrar uma solução segura? Ficarei muito grato por qualquer ajuda.

 

Valeu!

 

Ae cara, tens razão só agora prestei a devida atenção em qual área eu estava.

Como minha dúvida era com MySQL fui lá e criei um tópico na área certa e talvez isso possa te ajudar.

 

http://forum.imasters.com.br/index.php?/topic/411032-utilizar-ultimo-id-inserido/

 

A solução foi ler a respeito de transactions na documentação do mysql

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.