Pergunta

existe uma alternativa para mysql_insert_id() função em php para o PostgreSQL?A maioria dos quadros são a solução para o problema parcialmente por encontrar o valor atual da seqüência utilizada na IDENTIFICAÇÃO.No entanto, há momentos em que a chave primária não é uma coluna serial....

Foi útil?

Solução

A partir do PostgreSQL ponto de vista, em pseudo-código:

 * $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. 

 * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1

 * $insert_id = SELECT nextval('foo_seq'); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() só funciona onde você tem OIDs.OIDs ter sido desativado por padrão desde que o PostgreSQL 8.1.

Assim, dependendo de qual versão do PostgreSQL que você tem, você deve escolher um método acima.Idealmente, é claro, usar um banco de dados biblioteca de abstracção que abstrai o acima.Caso contrário, em código de baixo nível, ele se parece com:

Método um:INSERIR...VOLTAR

// yes, we're not using pg_insert()
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_row($result);
$insert_id = $insert_row[0];

Método dois:INSERIR;lastval()

$result = pg_execute($db, "INSERT INTO foo (bar) values (123);");
$insert_query = pg_query("SELECT lastval();");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];

Método três:nextval();INSERIR

$insert_query = pg_query($db, "SELECT nextval('foo_seq');");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");

A aposta mais segura seria o terceiro método, mas é difícil.O mais limpo é o primeiro, mas você precisa para executar uma recente do PostgreSQL.A maioria db abstração bibliotecas ainda não use o primeiro método embora.

Outras dicas

Confira o RETORNANDO cláusula opcional para uma instrução INSERT.(Link para o oficial da documentação do PostgreSQL)

Mas, basicamente, você faz:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

e a instrução INSERT próprio retorna o id (ou qualquer expressão que você especificar) da linha afetada.

A partir de php.net:

$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");

Este deve sempre fornecer a chave original, pois os principais obtidos a partir do banco de dados será nunca recuperados novamente.

Você também pode usar:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

Você tem que especificar em pg_fetch_result o número da linha e o nome do campo que você está procurando, esta é uma forma mais precisa para obter os dados de que você precisa, mas eu não sei se isso tem alguma penalidade no desempenho da consulta.Lembre-se que este método é para versões do PostgreSQL 8.2 e para cima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top