Postgresでレコードのrowidを取得する方法はありますか?
Oracleでは、私は
SELECT MAX(BILLS.ROWID) FROM BILLS
はい、rowidと同等のctid列があります。しかし、あなたには役に立たない。 Rowidとctidは物理的な行/タプル識別子です。再構築/バキューム後に変更できます。
PostgreSQLのrow_number()ウィンドウ関数は、rowidを使用するほとんどの目的に使用できます。 Oracleではrowidは結果データ行の固有の番号付けですが、Postgresではrow_number()は返されたデータの論理的な順序内で番号付けを計算します。通常、行に番号を付けたい場合は、特定の順序で行を期待することを意味するため、行に番号を付けるときに行を並べ替える列を指定します。
select client_name, row_number() over (order by date) from bills;
行に任意の番号を付けるだけの場合は、over句を空のままにできます。
select client_name, row_number() over () from bills;
行番号の集計を計算する場合は、サブクエリを使用する必要があります。
select max(rownum) from (
select row_number() over () as rownum from bills
) r;
必要なのがテーブルの最後のアイテムだけで、順番にソートする列がある場合、row_number()を使用するよりも簡単な方法があります。ソート順を逆にして、最初のアイテムを選択するだけです:
select * from bills
order by date desc limit 1;
シーケンスを使用します。 4バイトまたは8バイトの値を選択できます。
一意の列をテーブルに追加します(名前はrowid)。また、BEFORE UPDATEトリガーを作成して変更を防止します。これにより、誰かが更新しようとすると例外が発生します。 @JohnMuddが述べたように、この列にシーケンスを入力できます。