postgresqlの代替となるmysql_insert_id
-
09-06-2019 - |
質問
の代替手段はありますか mysql_insert_id()
PostgreSQLのphp関数?ほとんどのフレームワークは、ID で使用されているシーケンスの現在の値を見つけることで問題を部分的に解決しています。ただし、主キーがシリアル列ではない場合もあります...
解決
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:入れる...戻る
// 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:入れる;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 を実行する必要があります。ただし、ほとんどの db 抽象化ライブラリはまだ最初の方法を使用していません。
他のヒント
をチェックしてください RETURNING オプション句 INSERT ステートメントの場合。(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 以降を対象としていることに注意してください。