Was ist das PostgreSQL-Äquivalent zu Oracle ROWNUM und ROWID?


Beste Antwort

Ich habe sowohl mit Oracle- als auch mit PostgreSQL-Datenbanken gearbeitet und beantworte dies daher Frage nur aufgrund meiner eigenen Erfahrung mit ihnen.

  • Entspricht der ROWID von Oracle

PostgreSQL enthält eigene systemdefinierte Spalten. Unter diesen Spalten können Sie entweder ctid oder oid als Äquivalent für die Zeilen-ID von Oracle.

ctid – Dies ist eine PostgreSQL-Systemspalte vom Datentyp tid (Tupel-ID). Die Spalte enthält Informationen zu den physischen Blöcken auf Datensatzebene (Zeilenebene). Dieser Spaltenwert ändert sich jedoch ständig, wenn Sie einen Datensatz aktualisieren oder vollständige Vakuumvorgänge für eine Tabelle ausführen. Daher können Sie diesen Spaltenwert nur für temporäre Zwecke als eindeutige Zeilenkennung verwenden, z. B. zum Löschen von Duplikaten in einer Tabelle. Sie können sich nicht auf diesen Spaltenwert verlassen, um die Eindeutigkeit auf Datensatzebene für eine Tabelle zu bestimmen, wenn Sie seine Verwendung für langfristige Anwendungsfälle anwenden möchten, z. B. das Durchführen inkrementeller Einfügungen in eine Tabelle basierend auf dem maximalen / zuletzt eingefügten Spaltenwert.

oid – oid wird als „Objektkennung“ bezeichnet und enthält eindeutige Werte für einen logischen Datensatz / eine logische Zeile. Es ist vom Typ oid (wie der Spaltenname). Sie müssen jedoch explizit eine Tabelle mit der Syntax „WITH OIDS“ erstellen, damit diese Spalte für eine Tabelle erstellt wird. Sie können ein Beispiel hier überprüfen.

Hinweis :

Ab PostgreSQL 12 können Oids nicht mehr verwendet werden. Dies liegt daran, dass oid mit einer vorzeichenlosen 4-Byte-Ganzzahl implementiert wird. Daher ist es gefährlich, sich für die Eindeutigkeit auf diese zu verlassen, insbesondere wenn Ihre Tabellen massiv wachsen.

Aufgrund meiner persönlichen Erfahrung mit PostgreSQL ist es immer besser, einen benutzerdefinierten Spaltenwert wie den Ersatzschlüssel zu verwenden, um Datensätze eindeutig zu identifizieren, wenn Ihre Tabelle keinen Primärschlüssel hat.

  • Äquivalent für Oracle ROWNUM

PostgreSQL hat kein genaues Äquivalent für ein Rownum, das Sie verwenden könnten Ihre SQL-Abfragen „ select“ . Sie können dies jedoch nachahmen, indem Sie in Ihren SQL-Abfragen im laufenden Betrieb einen eindeutigen Wert erstellen.

Beispiel: (vorausgesetzt, Ihre Abfrage über eine Tabelle enthält 3 Spalten),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

ROWNUM in Oracle wird jedoch bereits zugewiesen, wenn Sie ein Tupel von der Festplatte lesen, während Sie es in der obigen Abfrage nach dem Lesen der Tupel generieren und daher einen weiteren Schritt benötigen Ich möchte den generierten ROWNUM-Wert tatsächlich anwenden.

Hinweis:

Sie können auch PostgreSQLs limit entspricht in etwa ROWNUM, Sie müssen jedoch eine weitere PostgreSQL-Funktionalität namens Offset , wenn Sie die ROWNUM-Verwendung von Oracle für a nachahmen möchten Bereichsfilterung (z. B. ROWNUM zwischen A und B). Hier können Sie nach einem Beispiel suchen: .

Danke fürs Lesen !!

நன்றி \_ / \ \_

Antwort

PostgreSQL ROW\_NUMBER () Erklärt mit praktischen Beispielen

Wurde bereits gefragt:

Was ist das PostgreSQL-Äquivalent von Oracle? ROWNUM und ROWID?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.