私はpostgreSQLを初めて使用するので、コミュニティからのポインタをいただければ幸いです。
継承したばかりのかなり古いサイトのCMSの一部の機能を更新しています。基本的に、データベースに挿入する前に記事のIDが必要です。とにかく、データベースセッション(挿入)が始まる前にシーケンスによって使用される次の値をチェックする方法はありますか?
最初は使用できると思いSELECT max(id) from tbl_name
ましたが、IDはシーケンスから自動的にインクリメントされ、記事は削除されることが多いため、シーケンス内の次の値に対して正しいIDが返されないことは明らかです。
記事がまだデータベースになく、データベースセッションが開始されていないため、currval()
postgreSQLの機能を使用できないようです。さらに、これを使用するnextval()
と、データが挿入される前にシーケンスが自動インクリメントされます(挿入によってシーケンスが自動インクリメントされ、シーケンスが二重にインクリメントされます)。
私が現在それを回避している方法は次のとおりです。
function get_next_id()
{
$SQL = "select nextval('table_id_seq')";
$response = $this->db_query($SQL);
$arr = pg_fetch_array($query_response, NULL, PGSQL_ASSOC);
$id = (empty($arr['nextval'])) ? 'NULL' : intval($arr['nextval']);
$new_id = $id-1;
$SQL = "select setval('table_id_seq', {$new_id})";
$this->db_query($SQL);
return $id;
}
SELECT nextval('table_id_seq')
シーケンス内の次のIDを取得するために使用します。これによりシーケンスがインクリメントされるので、すぐにシーケンスをSELECT setval('table_id_seq',$id)
元の値に戻すために使用します。このように、ユーザーがデータを送信し、コードが最終的にINSERTステートメントにヒットすると、自動インクリメントされ、挿入前と挿入後のIDは同一になります。
これは私にとってはうまくいきますが、私はpostgreSQLにあまり熱心ではなく、それが将来的に問題を引き起こす可能性があるのか、それとも彼らがより良い方法ではないのか疑問に思っています。自動インクリメントせずにシーケンスの次の値をチェックする方法はありませんか?
それが役立つ場合は、postgresql7.2を使用しています