Bästa svaret
Jag har arbetat med både Oracle och PostgreSQL-databaser och så svarar jag på detta fråga uteslutande baserat på min egen erfarenhet av dem.
- Motsvarar Oracles ROWID
PostgreSQL innehåller sina egna systemdefinierade kolumner och bland sådana kolumner kan du använda antingen ctid eller oid som motsvarighet till Oracles rowid.
ctid – Det är en PostgreSQL-systemkolumn av datatyp tid (tupleidentifierare). Kolumnen innehåller information om de fysiska blocken på rekordnivå (radnivå). Detta kolumnvärde ändras emellertid när du uppdaterar en post eller utför fullständiga vakuumåtgärder på ett bord. Därför kan du använda det här kolumnvärdet som en unik radidentifierare endast för tillfälliga ändamål, till exempel för att ta bort dubbletter i en tabell. Du kan inte förlita dig på det här kolumnvärdet för att bestämma postnivåens unikhet i en tabell om du vill använda dess användning för långvariga användningsfall som att utföra stegvisa insatser i en tabell baserat på det högsta / senast infogade kolumnvärdet.
oid – Känd som ”objektidentifierare”, oid innehåller unika värden för en logisk post / rad. Det är av typen oid (samma som kolumnnamnet). Du måste dock uttryckligen skapa en tabell med syntaxen ”WITH OIDS” för att den här kolumnen ska skapas för en tabell. Du kan kontrollera ett exempel här .
Anmärkning :
Från PostgreSQL 12 kan oids inte längre användas. Detta beror på att oid implementeras med ett osignerat 4-byte-heltal och därför är det farligt att lita på dem för unikhet, särskilt när dina tabeller växer kraftigt.
Baserat på min personliga erfarenhet av PostgreSQL är det alltid bättre att använda ett användardefinierat kolumnvärde som Surrogate Key för att unikt identifiera poster om din tabell inte har en primär nyckel.
- Motsvarar Oracles ROWNUM
PostgreSQL har inte en exakt motsvarighet för ett rownum som du kan använda i dina SQL “ välj” frågor. Du kan dock efterlikna det genom att skapa ett unikt värde i farten i dina SQL-frågor.
Till exempel (förutsatt att din fråga över en tabell innehåller 3 kolumner),
SELECT
COL\_A,
COL\_B,
COL\_C,
ROW\_NUMBER() OVER (ORDER BY COL\_A ASC) AS ROWNUM
FROM \_TABLE
ROWNUM i Oracle är dock redan tilldelat när du läser en tuple från disk medan du i den ovanstående frågan genererar den efter att du har läst tuplarna och därmed behöver du ett steg till när du vill faktiskt tillämpa det genererade ROWNUM-värdet.
Obs:
Du kan också överväga PostgreSQL: s limit som en nära motsvarighet till ROWNUM, men du måste använda ytterligare en funktion av PostgreSQL som heter offset när du vill efterlikna Oracles ROWNUM-användning för en intervallfiltrering (som ROWNUM mellan A och B). Du kan söka efter ett exempel här .
Tack för att du läste !!
நன்றி \_ / \ \_
Svar
PostgreSQL ROW\_NUMBER () Förklaras med praktiska exempel
Har redan blivit frågade:
Vad är PostgreSQL-ekvivalenten för Oracle ”s ROWNUM och ROWID?