Najlepsza odpowiedź
Pracowałem z bazami danych Oracle i PostgreSQL, więc odpowiadam na to pytanie oparte wyłącznie na moim własnym doświadczeniu z nimi.
- Odpowiednik Oracle ROWID
PostgreSQL zawiera własne kolumny zdefiniowane przez system, a wśród takich kolumn można użyć ctid lub oid jako odpowiednik dla rowid Oracle.
ctid – Jest to kolumna systemowa PostgreSQL typu tid (identyfikator krotki). Kolumna zawiera informacje o blokach fizycznych na poziomie rekordu (poziom wiersza). Jednak ta wartość kolumny zmienia się za każdym razem, gdy aktualizujesz rekord lub wykonujesz pełne operacje próżni na stole. Dlatego można użyć tej wartości kolumny jako unikatowego identyfikatora wiersza tylko do celów tymczasowych, na przykład do usunięcia duplikatów w tabeli. Nie możesz polegać na tej wartości kolumny przy podejmowaniu decyzji o unikalności poziomu rekordu w tabeli, jeśli chcesz zastosować jej użycie do długoterminowych przypadków użycia, takich jak wykonywanie wstawiania przyrostowego do tabeli na podstawie maksymalnej / ostatnio wstawionej wartości kolumny.
oid – Znany jako „identyfikator obiektu”, oid zawiera unikalne wartości dla logicznego rekordu / wiersza. Jest to typ oid (taki sam jak nazwa kolumny). Musisz jednak jawnie utworzyć tabelę przy użyciu składni „WITH OIDS”, aby ta kolumna została utworzona dla tabeli. Przykład możesz sprawdzić tutaj .
Uwaga :
Od PostgreSQL 12 nie można już używać oids. Dzieje się tak, ponieważ oid jest zaimplementowany przy użyciu 4-bajtowej liczby całkowitej bez znaku, a zatem poleganie na nich w celu zapewnienia wyjątkowości jest niebezpieczne, zwłaszcza gdy tabele gwałtownie rosną.
Opierając się na moich osobistych doświadczeniach z PostgreSQL, zawsze lepiej jest użyć wartości kolumny zdefiniowanej przez użytkownika, takiej jak klucz zastępczy, aby jednoznacznie zidentyfikować rekordy, jeśli twoja tabela nie ma klucza podstawowego.
- Odpowiednik Oracle ROWNUM
PostgreSQL nie ma dokładnego odpowiednika dla rownum, którego można by użyć w zapytania SQL „ wybierz” . Można to jednak naśladować, tworząc w locie unikalną wartość w zapytaniach SQL.
Na przykład (zakładając, że zapytanie w tabeli zawiera 3 kolumny),
SELECT
COL\_A,
COL\_B,
COL\_C,
ROW\_NUMBER() OVER (ORDER BY COL\_A ASC) AS ROWNUM
FROM \_TABLE
Jednak ROWNUM w Oracle jest już przypisane, gdy czytasz krotkę z dysku, podczas gdy w powyższym zapytaniu generujesz go po przeczytaniu krotek, a zatem potrzebujesz jeszcze jednego kroku, gdy faktycznie chcesz zastosować wygenerowaną wartość ROWNUM.
Uwaga:
Możesz również rozważyć PostgreSQL limit jako bliski odpowiednik ROWNUM, ale musisz użyć jeszcze jednej funkcji PostgreSQL o nazwie offset , gdy chcesz naśladować użycie Oracle ROWNUM dla filtrowanie zakresu (takie jak ROWNUM między A i B). Przykład możesz sprawdzić tutaj .
Dziękujemy za przeczytanie !!
நன்றி \_ / \ \_
Odpowiedź
PostgreSQL ROW\_NUMBER () Wyjaśnione z praktycznymi przykładami
Pytanie już zadano:
Jaki jest odpowiednik Oracle dla PostgreSQL ROWNUM i ROWID?