PostgreSQL에서 기본 키에 자동 증가 기능을 설정할 때는 시퀀스(Sequence) 를 활용합니다. 그러나 실무에서는 테이블을 사전에 정의한 뒤, 시퀀스를 나중에 따로 연결해야 하거나 SQL 파일로 배포 시 동적 값을 반영해야 할 수도 있습니다.
이번 글에서는 다음과 같은 내용을 단계별로 정리합니다.
- 특정 컬럼에 시퀀스가 적용되어 있는지 확인하고, 없을 경우 생성 및 연결하는 방법
- 시퀀스 생성 시 발생할 수 있는
sequence must have same owner as table오류 해결 - SQL 파일에 시작값을 반영하기 위한 자동화 방식
1. 시퀀스 존재 확인 및 자동 증가 설정
예를 들어 example_table이라는 테이블의 id 컬럼에 시퀀스가 연결되어 있지 않다면, 수동으로 생성하고 연동해줘야 합니다.
먼저 현재 최대 ID 값을 조회합니다.
SELECT MAX(id) FROM example_table;
예를 들어 조회 결과가 9050이라면, 다음과 같이 시퀀스를 생성합니다.
CREATE SEQUENCE example_table_id_seq START WITH 9051;
이후 해당 컬럼이 자동으로 시퀀스를 참조하도록 기본값을 설정합니다.
ALTER TABLE example_table ALTER COLUMN id SET DEFAULT nextval('example_table_id_seq');
마지막으로 시퀀스를 해당 컬럼과 연결하여 의존성을 명확히 지정합니다.
ALTER SEQUENCE example_table_id_seq OWNED BY example_table.id;
이렇게 하면 id 컬럼은 자동으로 시퀀스 값을 받아 증가하게 됩니다.
2. sequence must have same owner as table 오류 해결
시퀀스를 테이블에 연결하거나 기본값을 설정하는 과정에서 다음과 같은 오류가 발생할 수 있습니다.
ERROR: sequence must have same owner as table
이 오류는 시퀀스와 테이블의 소유자(owner) 가 다르기 때문에 발생합니다. PostgreSQL은 시퀀스를 테이블에 연결할 때 소유자가 일치해야 합니다.
해결 방법은 아래와 같이 ALTER SEQUENCE 명령어로 시퀀스의 소유자를 변경하는 것입니다.
ALTER SEQUENCE example_table_id_seq OWNER TO table_owner;
여기서 table_owner는 해당 테이블의 실제 소유자입니다. \dt+ example_table 명령어를 통해 확인할 수 있습니다.
3. SQL 파일 내 시작값을 자동으로 반영하는 방식
운영 환경에서 SQL 파일을 통해 시퀀스를 생성해야 하는 경우, START WITH 값을 수동으로 매번 입력하는 것은 번거롭고 실수할 가능성이 큽니다. 이를 자동화하기 위해 쉘 스크립트를 활용할 수 있습니다.
쉘 스크립트 예시
#!/bin/bash
# PostgreSQL에서 id 최대값 조회 후 1 증가
MAX_ID=$(psql -U postgres -d your_db -t -c "SELECT COALESCE(MAX(id), 0) + 1 FROM example_table;" | xargs)
# 템플릿 SQL 파일의 시작값을 치환하여 새 SQL 생성
sed "s/__START_VALUE__/$MAX_ID/" sequence_template.sql > create_sequence.sql
템플릿 SQL 예시 (sequence_template.sql)
CREATE SEQUENCE example_table_id_seq START WITH __START_VALUE__;
ALTER TABLE example_table ALTER COLUMN id SET DEFAULT nextval('example_table_id_seq');
ALTER SEQUENCE example_table_id_seq OWNED BY example_table.id;
이렇게 하면 매번 SQL을 수동 수정하지 않고, 현재 테이블의 ID 기준으로 자동 증가 시퀀스를 생성하는 SQL 파일을 생성할 수 있습니다.
마무리하며
PostgreSQL에서 시퀀스는 단순한 자동 증가 기능을 넘어서, 테이블 구조와의 긴밀한 연결이 필요합니다. 특히 기존 테이블에 시퀀스를 나중에 붙이거나, 배포 자동화를 위해 SQL 파일을 구성해야 하는 경우 위와 같은 과정이 매우 유용합니다. 또한, 예상치 못한 owner 관련 오류를 예방하고, 쉘 스크립트를 활용해 효율적인 배포도 가능해집니다.
'개발 (Development) > PostgreSQL' 카테고리의 다른 글
| [PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기 (0) | 2025.06.28 |
|---|---|
| [PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법 (0) | 2025.05.25 |
| [PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링 (0) | 2025.04.26 |
| [PostgreSQL] PostgreSQL JSON 쿼리 성능 개선과 Java에서의 활용 (1) | 2025.04.06 |
| [PostgreSQL/TimescaleDB] TimescaleDB 사용 중 hypertable 및 chunk 포함 전체 백업과 복원하기 (0) | 2025.04.05 |