DB

[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 → 필요하면 수동 입력 가능

둘 중 뭐 쓰는 게 좋냐?

항목bigserialidentity
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 자동증가
  • 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 쓰면 끝

Hi, I’m 관리자