[PostgreSql] bigserial = 내부적으로 sequence + default nextval() : PostgreSQL에는 AUTO INCREMENT / AUTO INCREASE 문법이 없다
JPA고 뭐고 필요 없고, 테이블 만들 때 AUTO INCREASE(자동증가)로 못 만드냐?
결론부터 말하면:
- PostgreSQL에는
AUTO INCREMENT / AUTO INCREASE문법이 없다 - 대신
SERIAL / BIGSERIAL또는IDENTITY를 쓴다
PostgreSQL에서는 다음과 같이 못 씀
id BIGINT AUTO_INCREMENT -- ❌ MySQL 문법
id BIGINT AUTO INCREASE -- ❌ 존재 안 함
PostgreSQL 자동증가 정답 문법
1️⃣ bigserial (구버전부터 쓰던 방식)
CREATE TABLE TB_ERR_LOR (
id BIGSERIAL NOT NULL,
err_msg VARCHAR(500),
created_at TIMESTAMP,
PRIMARY KEY (id)
);
✔ 내부적으로 sequence 자동 생성
✔ INSERT 시 id 생략하면 자동 증가
2️⃣ IDENTITY (PostgreSQL 10+ / 표준 SQL)
CREATE TABLE TB_ERR_LOR (
id BIGINT GENERATED ALWAYS AS IDENTITY,
err_msg VARCHAR(500),
created_at TIMESTAMP,
PRIMARY KEY (id)
);
또는
id BIGINT GENERATED BY DEFAULT AS IDENTITY
📌 차이
ALWAYS→ id 직접 넣기 불가BY DEFAULT→ 필요하면 수동 입력 가능
둘 중 뭐 쓰는 게 좋냐?
| 항목 | bigserial | identity |
|---|---|---|
| PostgreSQL 전통 | ✅ | |
| SQL 표준 | ✅ | |
| 신규 프로젝트 | ⚠️ | ✅ |
| 기존 테이블 | ✅ |
👉 신규면 IDENTITY 추천
👉 기존 호환이면 bigserial 유지
PostgreSQL 10+ 기준
AUTO_INCREMENT 같은 자동증가를 가장 깔끔하게 쓰는 IDENTITY 방식 DDL 딱 하나로 정리
PostgreSQL 10+ 권장 DDL (IDENTITY 방식)
CREATE TABLE TB_ERR_LOR (
id BIGINT GENERATED ALWAYS AS IDENTITY,
err_msg VARCHAR(500),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT PK_TB_ERR_LOR PRIMARY KEY (id)
);
설명 (핵심만)
GENERATED ALWAYS AS IDENTITY- INSERT 시
id직접 지정 ❌ - 완전 DB 자동증가
- INSERT 시
BIGINT- 기존
bigserial대체
- 기존
IDENTITY- PostgreSQL이 내부 sequence 자동 관리
created_at- 기본값 DB에서 자동 세팅
만약 수동 ID 입력도 허용하고 싶다면
id BIGINT GENERATED BY DEFAULT AS IDENTITY
(보통 로그 테이블은 ALWAYS가 맞음)
INSERT 예시 (id 생략)
INSERT INTO TB_ERR_LOR (err_msg)
VALUES ('에러 발생');
한 줄 요약
PostgreSQL 10+에서는
AUTO_INCREMENT대신BIGINT GENERATED ALWAYS AS IDENTITY쓰면 끝



