Jaký je PostgreSQL ekvivalent Oracle ROWNUM a ROWID?


Nejlepší odpověď

Pracoval jsem s databázemi Oracle i PostgreSQL, takže na to odpovídám otázka čistě na základě mých vlastních zkušeností s nimi.

  • Ekvivalent pro ROWID společnosti Oracle

PostgreSQL obsahuje vlastní systémově definované sloupce a mezi těmito sloupci můžete použít buď ctid nebo oid jako ekvivalent pro Rowid Oracle.

ctid – je to systémový sloupec PostgreSQL datového typu tid (identifikátor n-tice). Sloupec obsahuje informace o fyzických blocích na úrovni záznamu (na úrovni řádků). Tato hodnota sloupce se však neustále mění, kdykoli aktualizujete záznam nebo provádíte úplné vakuové operace v tabulce. Tuto hodnotu sloupce proto můžete použít jako jedinečný identifikátor řádku pouze pro dočasné účely, například pro odstranění duplikátů v tabulce. Na tuto hodnotu sloupce se nemůžete spolehnout při rozhodování o jedinečnosti úrovně záznamu v tabulce, pokud chcete použít její použití pro případy dlouhodobého použití, jako je provádění přírůstkových vložení do tabulky na základě hodnoty maximálního / posledního vloženého sloupce.

oid – známý jako „identifikátor objektu“, oid obsahuje jedinečné hodnoty pro logický záznam / řádek. Je typu oid (stejný jako název sloupce). Musíte však explicitně vytvořit tabulku pomocí syntaxe „S OIDY“, aby se tento sloupec vytvořil pro tabulku. Příklad můžete zkontrolovat zde .

Poznámka :

Od PostgreSQL 12 již nelze použít oids. Je to proto, že oid je implementován pomocí nepodepsaného 4bajtového celého čísla, a proto je nebezpečné spoléhat se na ně kvůli jedinečnosti, zvláště když vaše tabulky masivně rostou.

Na základě mých osobních zkušeností s PostgreSQL je vždy lepší použít uživatelem definovanou hodnotu sloupce, jako je náhradní klíč, k jedinečné identifikaci záznamů, pokud vaše tabulka nemá primární klíč.

  • Ekvivalent pro ROWNUM společnosti Oracle

PostgreSQL nemá přesný ekvivalent pro rownum, které byste mohli použít v vaše dotazy SQL „ select“ . Můžete jej však napodobit vytvořením jedinečné hodnoty za běhu ve vašich dotazech SQL.

Například (za předpokladu, že váš dotaz přes tabulku obsahuje 3 sloupce),

SELECT

COL\_A,

COL\_B,

COL\_C,

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

FROM \_TABLE

ROWNUM v Oracle je však již přiřazeno, když čtete n-tici z disku, zatímco ve výše uvedeném dotazu ji generujete po přečtení n-tic, a proto potřebujete ještě jeden krok, když ve skutečnosti chtějí použít vygenerovanou hodnotu ROWNUM.

Poznámka:

Můžete také zvážit PostgreSQL limit jako blízký ekvivalent ROWNUM, ale musíte použít ještě jednu funkci PostgreSQL nazvanou offset , když chcete napodobit ROWNUM využití Oracle pro filtrování rozsahu (například ROWNUM mezi A a B). Příklad můžete zkontrolovat zde .

Děkujeme za přečtení !!

நன்றி \_ / \ \_

Odpověď

PostgreSQL ROW\_NUMBER () vysvětleno praktickými příklady

Již jsem byl dotázán:

Co je PostgreSQL ekvivalent Oracle ROWNUM a ROWID?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *