PostgreSQL 에 오라클의 rowid 가상 컬럼에 해당하는게 무엇일가요?
바로 CTID 요놈입니다.
CTID 는 테이블 내부 행 버전의 물리적 위치를 나타냅니다. 오라클의 ROWID 처럼 행을 빠르게 찾기 위해 사용할 수 있지만 행 CTID 값은 지속성을 가지고 있지 않으므로, 값이 바뀔수 있으므로 주의해야 합니다.
아래는 CTID 가상 컬럼을 조회한 예입니다.
scott@[local]:5432 scottdb#SQL> select ctid, ename from emp;
ctid | ename
--------+--------
(0,1) | SMITH
(0,2) | ALLEN
(0,3) | WARD
(0,4) | JONES
(0,5) | MARTIN
(0,6) | BLAKE
(0,7) | CLARK
(0,8) | SCOTT
(0,9) | KING
(0,10) | TURNER
(0,11) | ADAMS
(0,12) | JAMES
(0,13) | FORD
(0,14) | MILLER
(14 rows)
Time: 161.787 ms
scott@[local]:5432 scottdb#SQL>
오라클에서 임의의 행 하나를 삭제하는
SQL> DELETE EMP WHERE ROWMUM=1
쿼리를 PostgreSQL 에서 어떻게 구현할수 있을까요?
SQL> DELETE FROM EMP LIMIT 1 아쉽게도 이렇게는 안됩니다.(syntax error)
이때 CTID 를 활용할수 있습니다. 아래처럼.
DELETE FROM EMP WHERE CTID IN (SELECT CTID FROM EMP LIMIT 1);