Qual è lequivalente PostgreSQL di Oracle ROWNUM e ROWID?


Migliore risposta

Ho lavorato con entrambi i database Oracle e PostgreSQL e quindi sto rispondendo a questa domanda domanda basata esclusivamente sulla mia esperienza con loro.

  • Equivalente a ROWID di Oracle

PostgreSQL contiene le proprie colonne definite dal sistema e tra queste colonne è possibile utilizzare ctid o oid come equivalente per rowid di Oracle.

ctid – È una colonna di sistema PostgreSQL di tipo dati tid (identificatore di tupla). La colonna contiene informazioni sui blocchi fisici a livello di record (livello di riga). Tuttavia, il valore di questa colonna continua a cambiare ogni volta che si aggiorna un record o si eseguono operazioni di vuoto completo su una tabella. Pertanto, è possibile utilizzare questo valore di colonna come identificatore di riga univoco solo per scopi temporanei, ad esempio, eliminando i duplicati in una tabella. Non puoi fare affidamento su questo valore di colonna per decidere lunicità del livello di record su una tabella se desideri applicarne lutilizzo per casi di utilizzo a lungo termine come lesecuzione di inserimenti incrementali a una tabella in base al valore di colonna massimo / ultimo inserito.

oid – Noto come “identificatore di oggetto”, oid contiene valori univoci per una riga / record logico. È di tipo oid (uguale al nome della colonna). Tuttavia, è necessario creare esplicitamente una tabella utilizzando la sintassi “WITH OIDS” affinché questa colonna venga creata per una tabella. Puoi controllare un esempio qui .

Nota :

Da PostgreSQL 12, gli oid non possono più essere usati. Questo perché oid viene implementato utilizzando un numero intero a 4 byte senza segno e quindi è pericoloso fare affidamento su di essi per lunicità, specialmente quando le tabelle sono in forte crescita.

In base alla mia esperienza personale con PostgreSQL, è sempre meglio utilizzare un valore di colonna definito dallutente come Surrogate Key per identificare in modo univoco i record se la tabella non ha una chiave primaria.

  • Equivalente per ROWNUM di Oracle

PostgreSQL non ha un equivalente esatto per un rownum che potresti usare in le query SQL “ select” . Tuttavia, puoi imitarlo creando un valore univoco al volo nelle tue query SQL.

Ad esempio (supponendo che la tua query su una tabella contenga 3 colonne),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

Tuttavia, ROWNUM in Oracle è già assegnato quando leggi una tupla dal disco mentre, nella query precedente, la generi dopo aver letto le tuple e quindi, hai bisogno di un ulteriore passaggio quando desidera effettivamente applicare il valore ROWNUM generato.

Nota:

Potresti anche prendere in considerazione div> limit come equivalente vicino a ROWNUM, ma è necessario utilizzare unaltra funzionalità di PostgreSQL chiamata offset quando desideri imitare lutilizzo di ROWNUM di Oracle per un filtro di intervallo (come ROWNUM tra A e B). Puoi controllare un esempio qui .

Grazie per la lettura !!

நன்றி \_ / \ \_

Risposta

PostgreSQL ROW\_NUMBER () spiegato con esempi pratici

Già chiesto:

Qual è lequivalente PostgreSQL di Oracle “s ROWNUM e ROWID?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *