web-dev-qa-db-ja.com

postgres 9.2でのROWIDと同等

Postgresでレコードのrowidを取得する方法はありますか?

Oracleでは、私は

SELECT MAX(BILLS.ROWID) FROM BILLS  
16
jobi88

はい、rowidと同等のctid列があります。しかし、あなたには役に立たない。 Rowidとctidは物理的な行/タプル識別子です。再構築/バキューム後に変更できます。

参照: 第5章データ定義> 5.4。システム列

13
baklarz2048

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
Oliver Crow

シーケンスを使用します。 4バイトまたは8バイトの値を選択できます。

http://www.neilconway.org/docs/sequences/

0
JohnMudd

一意の列をテーブルに追加します(名前はrowid)。また、BEFORE UPDATEトリガーを作成して変更を防止します。これにより、誰かが更新しようとすると例外が発生します。 @JohnMuddが述べたように、この列にシーケンスを入力できます。

0
Zaur Hajili