Wat is het PostgreSQL-equivalent van Oracle ' s ROWNUM en ROWID?


Beste antwoord

Ik heb gewerkt met zowel Oracle- als PostgreSQL-databases en dus beantwoord ik dit vraag puur gebaseerd op mijn eigen ervaring met hen.

  • Equivalent voor Oracles ROWID

PostgreSQL bevat zijn eigen door het systeem gedefinieerde kolommen en onder dergelijke kolommen kunt u ctid of oid als equivalent voor Oracles rowid.

ctid – Het is een PostgreSQL-systeemkolom van het gegevenstype tid (tuple identifier). De kolom bevat informatie over de fysieke blokken op recordniveau (rijniveau). Deze kolomwaarde blijft echter veranderen wanneer u een record bijwerkt of volledige vacuümbewerkingen uitvoert op een tafel. Daarom kunt u deze kolomwaarde alleen voor tijdelijke doeleinden gebruiken als een unieke rij-ID, bijvoorbeeld het verwijderen van duplicaten in een tabel. U kunt niet op deze kolomwaarde vertrouwen voor het bepalen van het unieke karakter van een tabel op recordniveau als u het gebruik ervan wilt toepassen voor gevallen van langdurig gebruik, zoals het uitvoeren van incrementele invoegingen in een tabel op basis van de maximale / laatst ingevoegde kolomwaarde.

oid – Bekend als “object-ID”, oid bevat unieke waarden voor een logische record / rij. Het is van het type oid (hetzelfde als de kolomnaam). U moet echter expliciet een tabel maken met de syntaxis “MET OIDS” om deze kolom voor een tabel te maken. Je kunt hier een voorbeeld bekijken.

Opmerking :

Vanaf PostgreSQL 12 kunnen oids niet meer worden gebruikt. Dit komt omdat oid wordt geïmplementeerd met een niet-ondertekend geheel getal van 4 bytes en daarom is het gevaarlijk om erop te vertrouwen voor hun uniekheid, vooral wanneer uw tabellen enorm groeien.

Op basis van mijn persoonlijke ervaring met PostgreSQL, is het altijd beter om een ​​door de gebruiker gedefinieerde kolomwaarde zoals Surrogate Key te gebruiken om records uniek te identificeren als uw tabel geen primaire sleutel heeft.

  • Equivalent voor Oracles ROWNUM

PostgreSQL heeft geen exact equivalent voor een rownum dat u zou kunnen gebruiken in uw SQL “ select” -querys. U kunt het echter nabootsen door direct een unieke waarde in uw SQL-querys te creëren.

Bijvoorbeeld (ervan uitgaande dat uw query over een tabel 3 kolommen bevat),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

ROWNUM in Oracle is echter al toegewezen wanneer u een tupel van schijf leest, terwijl u het in de bovenstaande query genereert na het lezen van de tupels en daarom heeft u nog een stap nodig wanneer u eigenlijk de gegenereerde ROWNUM-waarde wilt toepassen.

Opmerking:

Je zou ook PostgreSQLs kunnen overwegen limit vergelijkbaar met ROWNUM, maar je moet nog een functionaliteit van PostgreSQL gebruiken, genaamd offset wanneer u het ROWNUM-gebruik van Oracle wilt nabootsen voor een bereikfiltering (zoals ROWNUM tussen A en B). U kunt een voorbeeld controleren hier .

Bedankt voor het lezen !!

நன்றி \_ / \ \_

Antwoord

PostgreSQL ROW\_NUMBER () Uitgelegd met praktische voorbeelden

Er is al gevraagd:

Wat is het PostgreSQL-equivalent van Oracles ROWNUM en ROWID?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *