Hva tilsvarer PostgreSQL til Oracles ROWNUM and ROWID?


Beste svaret

Jeg har jobbet med både Oracle og PostgreSQL-databaser, og så svarer jeg på dette spørsmål utelukkende basert på min egen erfaring med dem.

  • Tilsvarer Oracles ROWID

PostgreSQL inneholder sine egne systemdefinerte kolonner, og blant slike kolonner kan du bruke enten ctid eller oid som en ekvivalent for Oracles rowid.

ctid – Det er en PostgreSQL-systemkolonne av datatypen tid (tupleidentifikator). Kolonnen inneholder informasjon om de fysiske blokkene på rekordnivå (radnivå). Denne kolonneverdien endres imidlertid hver gang du oppdaterer en post eller utfører fullstendige vakuumoperasjoner på et bord. Derfor kan du bruke denne kolonneverdien som en unik radidentifikator bare for midlertidige formål, for eksempel for å slette duplikater i en tabell. Du kan ikke stole på denne kolonneverdien for å bestemme unikhetsnivået på posten på en tabell hvis du vil bruke bruken av den i langvarige brukstilfeller, for eksempel å utføre trinnvise innsatser i en tabell basert på maksimum / sist satt inn kolonneverdi.

oid – kjent som «objektidentifikator», inneholder oid unike verdier for en logisk post / rad. Det er av typen oid (samme som kolonnenavnet). Du må imidlertid opprette en tabell eksplisitt ved hjelp av «WITH OIDS» -syntaks for at denne kolonnen skal opprettes for en tabell. Du kan sjekke et eksempel her .

Merk :

Fra PostgreSQL 12 kan ikke ids brukes lenger. Dette er fordi oid er implementert ved hjelp av usignert 4 byte heltall, og det er derfor farlig å stole på dem for unikhet, spesielt når bordene dine vokser massivt.

Basert på min personlige erfaring med PostgreSQL, er det alltid bedre å bruke en brukerdefinert kolonneverdi som Surrogate Key for å identifisere poster unikt hvis tabellen din ikke har en primærnøkkel.

  • Tilsvarende for Oracles ROWNUM

PostgreSQL har ikke et eksakt ekvivalent for et rownum som du kan bruke i SQL-spørsmålene dine <

select «. Du kan imidlertid etterligne det ved å opprette en unik verdi i farten i SQL-spørringene dine.

For eksempel (forutsatt at spørringen over en tabell inneholder 3 kolonner),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

ROWNUM i Oracle er imidlertid allerede tildelt når du leser en tuple fra disken, mens du i genereringsspørringen ovenfor genererer den etter å ha lest tuplene, og derfor trenger du ett trinn til når du vil faktisk bruke den genererte ROWNUM-verdien.

Merk:

Du kan også vurdere PostgreSQLs limit som en nær ekvivalent med ROWNUM, men du må bruke en funksjonalitet til PostgreSQL kalt offset når du vil etterligne Oracles ROWNUM-bruk for en rekkevidde filtrering (for eksempel ROWNUM mellom A og B). Du kan se etter et eksempel her .

Takk for at du leser !!

நன்றி \_ / \ \_

Svar

PostgreSQL ROW\_NUMBER () Forklart med praktiske eksempler

Allerede blitt spurt:

Hva er PostgreSQL-ekvivalenten til Oracles ROWNUM og ROWID?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *