23

mysql_insert_id()PostgreSQLの php 関数に代わるものはありますか? ほとんどのフレームワークは、ID で使用されているシーケンスの現在の値を見つけることによって、問題を部分的に解決しています。ただし、主キーがシリアル列ではない場合があります....

4

4 に答える 4

43

PostgreSQL の観点から、疑似コードで:

 * $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()OID がある場合にのみ機能します。PostgreSQL 8.1 以降、OID はデフォルトでオフになっています。

そのため、使用している PostgreSQL のバージョンに応じて、上記の方法のいずれかを選択する必要があります。もちろん、理想的には、上記を抽象化するデータベース抽象化ライブラリを使用します。それ以外の場合、低レベルのコードでは次のようになります。

方法 1: INSERT... RETURNING

// 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];

方法 2: INSERT; 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];

方法 3: nextval(); 入れる

$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);");

最も安全な方法は 3 番目の方法ですが、扱いにくいです。最もクリーンなものが最初ですが、最新の PostgreSQL を実行する必要があります。ただし、ほとんどのデータベース抽象化ライブラリはまだ最初の方法を使用していません。

于 2008-09-11T09:32:42.247 に答える
3

INSERT ステートメントのRETURNING オプション句を確認してください。(公式の PostgreSQL ドキュメントへのリンク)

しかし、基本的には、次のことを行います。

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

INSERT ステートメント自体は、影響を受ける行の ID (または指定した任意の式) を返します。

于 2008-09-11T07:42:16.177 に答える
3

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')");

データベースから取得されたキーは二度と取得されないため、これは常に一意のキーを提供する必要があります。

于 2008-09-11T08:43:38.183 に答える
3

以下も使用できます。

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

pg_fetch_result で、探している行の番号とフィールドの名前を指定する必要があります。これは、必要なデータを取得するためのより正確な方法ですが、これがクエリのパフォーマンス。この方法は PostgreSQL バージョン 8.2 以降用であることを忘れないでください。

于 2011-05-02T23:36:42.760 に答える