개발하다 보면 컬럼 값이 자동으로 증가하도록 하고 싶을 때가 많습니다.
MySQL에서는 AUTO_INCREMENT 키워드 하나로 쉽게 해결되지만, PostgreSQL은 조금 다른 방식을 씁니다.
PostgreSQL에서는 시퀀스(Sequence) 라는 객체를 만들어서 컬럼에 연결해주면 자동 증가를 구현할 수 있습니다.
이번 글에서는 제가 실제로 적용했던 과정을 기록해둡니다.
먼저 시퀀스를 하나 만들어야 합니다. 저는 0부터 시작해서 1씩 증가하도록 세팅했습니다.
CREATE SEQUENCE my_table_id_seq
INCREMENT BY 1
MINVALUE 0
MAXVALUE 9223372036854775807
START 0
CACHE 1
NO CYCLE;
여기서 옵션은 간단히 요약하면:
INCREMENT BY 1 → 1씩 증가MINVALUE 0 / START 0 → 0부터 시작MAXVALUE → BIGINT의 최대값까지 사용 가능NO CYCLE → 최대값 도달하면 다시 0으로 안 돌려줌id 컬럼에 붙여줍니다.ALTER TABLE my_table
ALTER COLUMN id SET DEFAULT nextval('my_table_id_seq'::regclass);
이렇게 하면 INSERT 할 때 id를 생략하면 자동으로 증가된 값이 들어갑니다.
추가로 아래처럼 소유권을 연결해두면 관리가 편합니다.
ALTER SEQUENCE my_table_id_seq
OWNED BY my_table.id;
이렇게 해두면 테이블을 삭제할 때 관련 시퀀스도 같이 정리됩니다.
이미 데이터가 들어있는 경우, 시퀀스가 현재 최대값 이후부터 증가하도록 맞춰줘야 합니다.
SELECT setval('my_table_id_seq', COALESCE((SELECT MAX(id) FROM my_table), 0) + 1, false);
예를 들어 id가 이미 5까지 들어있다면, 다음 insert부터는 6부터 시작합니다.
이제 실제로 데이터를 넣어봅니다.
INSERT INTO my_table (name, description)
VALUES ('첫 번째 데이터', '테스트1');
INSERT INTO my_table (name, description)
VALUES ('두 번째 데이터', '테스트2');
조회해보면 👇
SELECT id, name FROM my_table;
| id | name |
|---|---|
| 0 | 첫 번째 데이터 |
| 1 | 두 번째 데이터 |
자동 증가가 잘 동작하는 걸 확인할 수 있습니다 ✅
MySQL에서 AUTO_INCREMENT를 쓰던 분들이라면 PostgreSQL에서 시퀀스가 조금 낯설 수 있습니다.
하지만 한번 써보면 훨씬 유연하게 제어할 수 있어서 상황에 따라 더 유용합니다.
GENERATED AS IDENTITY 쓰는 게 제일 간단저는 이번에 기존 테이블에 적용하면서 시퀀스를 활용했는데, 덕분에 MySQL보다 세세하게 컨트롤할 수 있다는 걸 알게 되었습니다. 😎