PostgreSQL에서 WITHOUT OIDS 옵션은 더 이상 필요하지 않고, 최신 버전에서는 deprecated(사용 중단) 되었습니다.
- OID란? Object Identifier의 약자로, 예전 PostgreSQL에서는 모든 행(row)에 별도의 ID(OID)를 부여하던 시스템이었음.
- 현재는? PostgreSQL 12 이상에서 WITHOUT OIDS/WITH OIDS 옵션 자체가 제거되었습니다.
- 결론 그냥 아래처럼 쓰시면 됩니다.
CREATE TABLE public.EQUIPMENT_CODE ( ... );

OID(Object Identifier)는 PostgreSQL 내부에서 각각의 객체(테이블, 인덱스, 컬럼, 함수, row 등)를 고유하게 식별하기 위해 사용하는 4바이트 정수값입니다.
시스템 카탈로그의 고유 식별자
PostgreSQL 내부적으로 테이블, 컬럼, 함수 등 다양한 객체를 관리합니다.
이 객체들을 시스템 테이블(system catalog, 예: pg_class, pg_type, pg_proc 등)에서 OID로 고유하게 식별합니다.
예시: pg_class.oid는 각각의 테이블을, pg_proc.oid는 각각의 함수를 식별합니다.
과거엔 사용자 테이블의 각 행(row)에도 OID
PostgreSQL 예전 버전에서는, 일반 데이터 테이블의 각 행(row)에도 OID가 자동 생성되었습니다.
현재는 기본적으로 비활성화되어 있고, 대부분의 경우 사용되지 않습니다.
Foreign Key처럼 활용 불가
고유성: 시스템 전체적으로 유일한 숫자입니다(단, 오버플로우되면 중복 가능).
사용자 데이터 열로 추천하지 않음: OID는 내부 식별자일 뿐 데이터의 관계(Primary, Foreign Key) 등에는 사용하지 않습니다.
row-level OID는 기본 OFF: 최신 버전에서는 테이블의 각 행마다 OID를 부여하지 않습니다.
시스템 카탈로그에서만 중요: 보통 개발자는 OID 대신 PK나 유니크 키를 사용합니다.
SELECT oid, relname
FROM pg_class
WHERE relname = 'my_table';
| 용도 | 설명 |
|---|---|
| 내부 식별자 | PostgreSQL 객체와 시스템 카탈로그에서 사용 |
| 과거 row-level OID 지원 | 테이블의 각 row에 OID를 자동 부여했음 |
| 현재 row-level OID 비활성화 | 최신 버전에서는 기본적으로 사용되지 않음 |
CREATE TABLE my_table (
id SERIAL PRIMARY KEY,
name TEXT
) WITH (OIDS = FALSE);
위 구문은 테이블을 생성할 때 행마다 OID를 생성하지 마라는 의미입니다.
즉, 아래 두 구문은 사실상 같은 역할을 합니다.
WITH (OIDS = FALSE)
WITHOUT OIDS
둘 다 "이 테이블에 OID를 사용하지 마라"는 의미입니다.
OID가 기본적으로 각 행에 저장됩니다.
명시적으로 OID를 끄고 싶으면 WITH (OIDS = FALSE) 또는 WITHOUT OIDS 옵션 사용.
테이블의 OID 지원이 Deprecated(폐지 예정)입니다.
이 시기부터는 기본값이 OIDS = FALSE입니다.
명시적으로 켜고 싶으면 WITH (OIDS = TRUE) 또는 WITH OIDS 사용(추천X).
OIDS 옵션 완전히 제거
WITH (OIDS=...) 구문 사용 시 다음과 같은 오류 발생ERROR: unrecognized parameter "oids"
WITH (OIDS = FALSE)는 더 이상 필요 없으며, 지원되지 않습니다.
사용 시 문법 오류가 납니다.
OID가 필요한 특수한 케이스(매우 드물고 옛날 방식)가 아니라면, 신경 쓸 필요 없습니다.