Bedste svar
Jeg har arbejdet med både Oracle og PostgreSQL-databaser, og så svarer jeg på dette spørgsmål udelukkende baseret på min egen erfaring med dem.
- Svarer til Oracles ROWID
PostgreSQL indeholder sine egne systemdefinerede kolonner, og blandt sådanne kolonner kan du bruge enten ctid eller oid som en ækvivalent for Oracles rowid.
ctid – Det er en PostgreSQL-systemkolonne af datatypen tid (tuple-id). Kolonnen indeholder oplysninger om de fysiske blokke på et rekordniveau (række-niveau). Denne søjleværdi ændrer sig imidlertid, hver gang du opdaterer en post eller udfører fulde vakuumhandlinger på et bord. Derfor kan du kun bruge denne kolonneværdi som en unik rækkeidentifikator kun til midlertidige formål, for eksempel ved at slette duplikater i en tabel. Du kan ikke stole på denne søjleværdi for at bestemme unikke poster på niveauet på en tabel, hvis du vil anvende dens anvendelse til langvarige brugssager, såsom at udføre trinvise indsatser til en tabel baseret på den maksimale / sidst indsatte søjleværdi.
oid – Kendt som “objekt-id”, oid indeholder unikke værdier for en logisk post / række. Det er af typen oid (samme som kolonnenavnet). Du skal dog eksplicit oprette en tabel ved hjælp af “WITH OIDS” -syntaks for at denne kolonne skal oprettes til en tabel. Du kan tjekke et eksempel her .
Bemærk :
Fra PostgreSQL 12 kan ids ikke bruges mere. Dette skyldes, at oid implementeres ved hjælp af usigneret 4 byte heltal, og det er derfor farligt at stole på dem for unikhed, især når dine tabeller vokser massivt.
Baseret på min personlige erfaring med PostgreSQL er det altid bedre at bruge en brugerdefineret søjleværdi såsom Surrogatnøgle til entydigt at identificere poster, hvis din tabel ikke har en primær nøgle.
- Ækvivalent til Oracles ROWNUM
PostgreSQL har ikke en nøjagtig ækvivalent til et rownum, som du kan bruge i dine SQL “ vælg” forespørgsler. Du kan dog efterligne det ved at oprette en unik værdi i farten i dine SQL-forespørgsler.
For eksempel (forudsat at din forespørgsel over en tabel indeholder 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 dog allerede tildelt, når du læser en tuple fra disken, mens du i ovenstående forespørgsel genererer det efter at have læst tuplerne, og derfor har du brug for et trin mere, når du faktisk ønsker at anvende den genererede ROWNUM-værdi.
Bemærk:
Du kan også overveje PostgreSQLs limit som et næsten svarende til ROWNUM, men du skal bruge en mere funktionalitet af PostgreSQL kaldet offset når du vil efterligne Oracles ROWNUM-brug til en rækkevidde filtrering (såsom ROWNUM mellem A og B). Du kan tjekke et eksempel her .
Tak for læsningen !!
நன்றி \_ / \ \_
Svar
PostgreSQL ROW\_NUMBER () Forklaret med praktiske eksempler
Allerede blevet spurgt:
Hvad er PostgreSQL-ækvivalent med Oracles ROWNUM og ROWID?