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
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?