OracleのROWNUMおよびROWIDに相当するPostgreSQLとは何ですか?


ベストアンサー

OracleとPostgreSQLの両方のデータベースを使用したことがあるので、これに答えています。純粋に私自身の経験に基づいた質問です。

  • OracleのROWIDに相当

PostgreSQLには独自のシステム定義列が含まれており、そのような列の中で、 ctid または oid <のいずれかを使用できます。 / span>はOracleのROWIDに相当します。

ctid -データタイプtid(タプル識別子)のPostgreSQLシステム列です。この列には、レコードレベル(行レベル)での物理ブロックに関する情報が含まれています。ただし、この列の値は、レコードを更新したり、テーブルに対して完全なバキューム操作を実行したりするたびに変化し続けます。したがって、この列の値を一意の行識別子として使用できるのは、テーブル内の重複を削除するなどの一時的な目的のみです。最大/最後に挿入された列の値に基づいてテーブルに増分挿入を実行するなどの長期的な使用例にその使用法を適用する場合、テーブルのレコードレベルの一意性を決定するためにこの列の値を信頼することはできません。

oid -「オブジェクト識別子」と呼ばれるoidには、論理レコード/行の一意の値が含まれます。タイプはoidです(列名と同じ)。ただし、この列をテーブル用に作成するには、「WITHOIDS」構文を使用してテーブルを明示的に作成する必要があります。 ここの例を確認できます。

PostgreSQL 12から、oidは使用できなくなりました。これは、oidが符号なし4バイト整数を使用して実装されているため、特にテーブルが大幅に拡大している場合に、一意性をそれらに依存するのは危険です。

PostgreSQLでの個人的な経験に基づくと、テーブルに主キーがない場合は、サロゲートキーなどのユーザー定義の列値を使用してレコードを一意に識別することをお勧めします。

  • OracleのROWNUMに相当

PostgreSQLには、で使用できるrownumに完全に相当するものがありません。 SQLの「選択」クエリ。ただし、SQLクエリでその場で一意の値を作成することで模倣できます。

たとえば(テーブルに対するクエリに3つの列が含まれていると仮定)、

SELECT

COL\_A,

COL\_B,

COL\_C,

ROW\_NUMBER() OVER (ORDER BY COL\_A ASC) AS ROWNUM

FROM \_TABLE

ただし、OracleのROWNUMは、ディスクからタプルを読み取るときにすでに割り当てられていますが、上記のクエリでは、タプルを読み取った後に生成されるため、次の手順が必要になります。生成されたROWNUM値を実際に適用したい。

注:

PostgreSQLの limit はROWNUMとほぼ同等ですが、 オフセット OracleのROWNUMの使用法を模倣する場合範囲フィルタリング(AとBの間のROWNUMなど)。例を確認できます こちら

お読みいただきありがとうございます!!

நன்றி\_/ \ \_

回答

PostgreSQL ROW\_NUMBER()の実用的な例の説明

すでに質問されています:

PostgreSQLでOracleに相当するものは何ですか? ROWNUMとROWID?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です