Mysql 에서는 auto_increment 라는 속성을 부여해주면 자동으로 증가하게 만들어줄 수 있다.
Postgres 에서는 auto_increment 라는 속성을 부여할 수 없기 때문에 다른 방법을 통해서 증가하게 만들어주어야 한다.
그래서 postgres 의 auto increment 에는 어떤 방법들이 있는지 정리해보려고 한다.
Sequence 객체를 사용해서 auto increment 하기
postgres 에는 Sequence 라고 하는 number generator 가 있다.
더 쉽게 말해서 순차적인 값을 생성해주는 객체라고 생각하면 된다.
Sequence 는 다음과 같이 명령어를 통해 생성할 수 있다.
CREATE SEQUENCE seq_user_id
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1;
Sequence 를 생성한 이후에는 다음과 같이 값을 변경해줄 수 있다.
ALTER SEQUENCE [ IF EXISTS ] 이름
[ AS 자료형 ]
[ INCREMENT [ BY ] 증가값 ]
[ MINVALUE 최소값 | NO MINVALUE ] [ MAXVALUE 최대값 | NO MAXVALUE ]
[ START [ WITH ] 시작값 ]
[ RESTART [ [ WITH ] 재시작값 ] ]
[ CACHE 캐시 ] [ [ NO ] CYCLE ]
[ OWNED BY { 테이블이름.칼럼이름 | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] 이름 OWNER TO { 새소유주 | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] 이름 RENAME TO 새이름
ALTER SEQUENCE [ IF EXISTS ] 이름 SET SCHEMA 새스키마
만약 사용하지 않는다면 다음과 같이 삭제할 수 있다.
DROP SEQUENCE seq_user_id;
만약 나와 같이 DBeaver 와 같은 데이터베이스 관리 도구를 사용한다면
Seqeunce 는 Database > Schema > Sequences
경로에서 확인할 수 있다.
Sequence 를 생성하고 확인해보면 다음과 같이 Value 를 설정해줄 수 있다.
참고로 사진 속 Max Value 가 다른 건 변경해주었기 때문이다.
아래 사진을 보면 최소 값과 최대 값이 정해져 있고 시작할 값과 얼마나 값을 증가시킬지 등과 같이 필요에 따라 설정할 수 있다.
이렇게 Sequence 를 생성하고 컬럼에 적용시켜주면 auto increment 와 같이 사용할 수 있게 된다.
값을 증가시켜주고 싶은 컬럼의 Default 값에 추가해주면 되는데 다음과 같이 추가해줄 수 있다.
CREATE TABLE test
(
id int4 NOT NULL DEFAULT nextval('test.test_id_seq'::regclass),
namne text NOT NULL,
age int4 NOT NULL,
)
nextval 이라는 함수를 통해서 추가해줄 수 있고
nextval 함수 안에 Sequence 값이 들어가게 되는데 다음과 같은 규칙으로 입력해준다.
nextval('[Schema Name].[Sequence Name]')
설정을 마치고 데이터를 insert 하게 되면 id 의 값이 자동으로 증가하는 것을 확인할 수 있다.
Serial 자료형을 사용해서 auto increment 사용하기
Sequence 를 사용하지 않을 것이라고 생각했지만 primary key 를 serial 자료형으로 만들면 결국 내부적으로 Sequence 를 만든다고 한다. postgres 에서는 내부적으로 Sequence 를 사용하는 것으로 볼 수 있다.
그래서 직접 테스트를 진행해보았다.
테스트를 하기 위해서 test_serial 라는 테이블을 생성했다.
CREATE TABLE test_ods.test_serial (
id serial4 NOT NULL,
"name" text NOT NULL
);
테이블을 생성하자마자 바로 Sequence 객체가 생성되었다. 그리고 id 컬럼에 Default 가 자동으로 생성되었다.
다음과 같이 데이터를 insert 하니 값이 자동으로 증가하는 것을 볼 수 있었다.
insert into test_ods.test_serial (name) VALUES ('홍길동');
그리고 자동으로 Sequence 가 삭제되나 확인해보니 테이블이 삭제됨과 동시에 Sequence 도 같이 삭제되었다.
GENERATED ALWAYS AS IDENTITY 구문 사용해서 auto increment 사용하기
참고한 블로그에 따르면 다음과 같은 구문을 사용해서 auto increment 를 해줄 수 있다고 한다.
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
그래서 직접 사용해봤다.
create table "test_ods"."test_identity" (
"id" integer generated always as identity,
"name" text not null
);
아래와 같이 테이블을 생성했떠니 id 컬럼의 Identity 에 Always 라는 값이 설정되어있는 것을 확인할 수 있었고
이번에도 마찬가지로 Sequence 가 자동으로 생성되는 것을 확인할 수 있었다.
마찬가지로 default 로 설정하면 Defualt 에 nextval 함수가 추가된다.
다음과 같이 데이터를 insert 하니 값이 자동으로 증가하는 것을 볼 수 있었다.
insert into test_ods.test_identity (name) VALUES ('홍길동');
테이블을 삭제하게 되면 Sequence 도 자동으로 삭제가 되는 것도 확인했다.
마지막으로 이렇게 3가지 정도의 방법으로 postgres 에서 auto increment 를 사용해봤는데
Sequence 를 생성해주어 값을 증가시켜준다는 것을 알았고
auto increment 하는 방법에 대해서 정리하고 싶었는데 결국에는 Sequence 를 적용하는 방법에 대해서 정리한 것 같다.
참고 사이트
https://kindloveit.tistory.com/71
https://postgresql.kr/docs/12/sql-altersequence.html
'데이터 엔지니어링 > Database' 카테고리의 다른 글
Postgresql Idle in transaction (1) | 2024.03.14 |
---|---|
Postgresql 컬럼 기본값(default) 설정 (1) | 2023.10.05 |
Postgresql 과 MySQL 비교 (0) | 2023.08.10 |
Mysql OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') 에러 발생 (0) | 2023.07.06 |
Mysql 8 버전 Sequal Pro 접속 에러 (0) | 2023.04.14 |