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?