mysql_insert_id()
PostgreSQLの php 関数に代わるものはありますか? ほとんどのフレームワークは、ID で使用されているシーケンスの現在の値を見つけることによって、問題を部分的に解決しています。ただし、主キーがシリアル列ではない場合があります....
4 に答える
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 を実行する必要があります。ただし、ほとんどのデータベース抽象化ライブラリはまだ最初の方法を使用していません。
INSERT ステートメントのRETURNING オプション句を確認してください。(公式の PostgreSQL ドキュメントへのリンク)
しかし、基本的には、次のことを行います。
INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col
INSERT ステートメント自体は、影響を受ける行の ID (または指定した任意の式) を返します。
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')");
データベースから取得されたキーは二度と取得されないため、これは常に一意のキーを提供する必要があります。
以下も使用できます。
$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 以降用であることを忘れないでください。