최상의 답변
Oracle 및 PostgreSQL 데이터베이스를 모두 사용 했으므로 이에 대한 답변입니다. 내 자신의 경험을 바탕으로 한 질문입니다.
- Oracle의 ROWID와 동일
PostgreSQL에는 자체 시스템 정의 열이 포함되어 있으며 이러한 열 중에서 ctid 또는 oid <를 사용할 수 있습니다. / span> Oracle의 rowid에 해당합니다.
ctid -데이터 유형 tid (튜플 식별자)의 PostgreSQL 시스템 열입니다. 열에는 레코드 레벨 기준 (행 레벨)의 실제 블록에 대한 정보가 포함됩니다. 그러나이 열 값은 레코드를 업데이트하거나 테이블에서 완전 진공 작업을 수행 할 때마다 계속 변경됩니다. 따라서 테이블에서 중복 항목을 삭제하는 등의 임시 목적으로 만이 열 값을 고유 한 행 식별자로 사용할 수 있습니다. 최대 / 마지막으로 삽입 된 열 값을 기반으로 테이블에 증분 삽입을 수행하는 것과 같은 장기 사용 사례에 사용을 적용하려는 경우 테이블에서 레코드 수준 고유성을 결정하는 데이 열 값을 사용할 수 없습니다.
oid – “개체 식별자”로 알려진 oid는 논리 레코드 / 행에 대한 고유 한 값을 포함합니다. oid 유형입니다 (열 이름과 동일). 그러나 테이블에 대해이 열을 만들려면 “WITH OIDS”구문을 사용하여 테이블을 명시 적으로 만들어야합니다. 여기 에서 예제를 확인할 수 있습니다.
참고 :
PostgreSQL 12부터는 oid를 더 이상 사용할 수 없습니다. 이는 oid가 부호없는 4 바이트 정수를 사용하여 구현 되었기 때문에 특히 테이블이 크게 증가 할 때 고유성을 위해 이들에 의존하는 것은 위험합니다.
PostgreSQL에 대한 개인적인 경험을 바탕으로 테이블에 기본 키가없는 경우 항상 대리 키와 같은 사용자 정의 열 값을 사용하여 레코드를 고유하게 식별하는 것이 좋습니다.
- Oracle의 ROWNUM에 해당
PostgreSQL에는 사용할 수있는 rownum에 대해 정확히 해당하는 항목이 없습니다. SQL“ select” 쿼리. 그러나 SQL 쿼리에서 즉시 고유 한 값을 생성하여이를 모방 할 수 있습니다.
예를 들어 (테이블에 대한 쿼리가 3 개의 열을 포함한다고 가정),
SELECT
COL\_A,
COL\_B,
COL\_C,
ROW\_NUMBER() OVER (ORDER BY COL\_A ASC) AS ROWNUM
FROM \_TABLE
그러나 Oracle의 ROWNUM은 디스크에서 튜플을 읽을 때 이미 할당 된 반면, 위 쿼리에서는 튜플을 읽은 후 생성하므로 한 단계 더 필요합니다. 실제로 생성 된 ROWNUM 값을 적용하려고합니다.
참고 :
PostgreSQL의 limit 는 ROWNUM과 거의 동일하지만 offset for Oracle의 ROWNUM 사용을 모방하려는 경우 범위 필터링 (예 : A와 B 사이의 ROWNUM). 여기 .
읽어 주셔서 감사합니다 !!
நன்றி \_ / \ \_
답변
PostgreSQL ROW\_NUMBER () 실용적인 예제와 함께 설명
이미 질문 :
Oracle과 동등한 PostgreSQL은 무엇입니까? ROWNUM 및 ROWID?