Qual é o equivalente PostgreSQL do Oracle ' s ROWNUM e ROWID?


Melhor resposta

Trabalhei com bancos de dados Oracle e PostgreSQL e, portanto, estou respondendo a esta pergunta puramente baseada em minha própria experiência com eles.

  • Equivalente para ROWID da Oracle

PostgreSQL contém suas próprias colunas definidas pelo sistema e entre essas colunas, você pode usar ctid ou oid como um equivalente para o rowid do Oracle.

ctid – É uma coluna do sistema PostgreSQL do tipo de dados tid (identificador de tupla). A coluna contém informações sobre os blocos físicos em uma base de nível de registro (nível de linha). No entanto, o valor desta coluna muda sempre que você atualiza um registro ou executa operações de vácuo completo em uma tabela. Portanto, você pode usar esse valor de coluna como um identificador de linha exclusivo apenas para fins temporários, por exemplo, excluir duplicatas em uma tabela. Você não pode confiar neste valor de coluna para decidir a exclusividade de nível de registro em uma tabela se quiser aplicar seu uso para casos de uso de longo prazo, como realizar inserções incrementais em uma tabela com base no valor máximo / último da coluna inserida.

oid – Conhecido como “identificador de objeto”, oid contém valores únicos para um registro / linha lógico. É do tipo oid (igual ao nome da coluna). No entanto, você precisa criar explicitamente uma tabela usando a sintaxe “WITH OIDS” para que esta coluna seja criada para uma tabela. Você pode verificar um exemplo aqui .

Nota :

A partir do PostgreSQL 12, os oids não podem mais ser usados. Isso ocorre porque o oid é implementado usando um inteiro sem sinal de 4 bytes e, portanto, é perigoso confiar neles para exclusividade, especialmente quando suas tabelas estão crescendo muito.

Com base em minha experiência pessoal com PostgreSQL, é sempre melhor usar um valor de coluna definido pelo usuário, como Surrogate Key, para identificar registros de forma exclusiva se sua tabela não tiver uma chave primária.

  • Equivalente para ROWNUM da Oracle

PostgreSQL não tem um equivalente exato para um rownum que você possa usar em suas consultas “ select” SQL. No entanto, você pode imitá-lo criando um valor único em tempo real em suas consultas SQL.

Por exemplo (supondo que sua consulta em uma tabela contenha 3 colunas),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

No entanto, ROWNUM no Oracle já é atribuído quando você lê uma tupla do disco enquanto, na consulta acima, você o gera após ler as tuplas e, portanto, você precisa de mais uma etapa quando realmente deseja aplicar o valor ROWNUM gerado.

Observação:

Você também pode considerar o PostgreSQL limit como equivalente próximo ao ROWNUM, mas você precisa usar mais uma funcionalidade do PostgreSQL chamada deslocamento quando você deseja imitar o uso de ROWNUM da Oracle para um filtragem de intervalo (como ROWNUM entre A e B). Você pode verificar um exemplo aqui .

Obrigado pela leitura !!

நன்றி \_ / \ \_

Resposta

PostgreSQL ROW\_NUMBER () explicado com exemplos práticos

Já foi perguntado:

Qual é o PostgreSQL equivalente ao Oracle “s ROWNUM e ROWID?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *