본문 바로가기
프로그래밍/SQL

[PostgreSQL] Sequence란?

by 일상 속 둔치 2020. 7. 19.

Sequence란 유일한 값을 생성하게 도와주는 객체이다.

 

주로 ID와 같이 순차적으로 증가하는 컬럼에 많이 사용한다.

 

Sequence는 테이블과는 독립적으로 저장되고 생성되기 때문에 여러 테이블에서 참조해서 공유되지 않게 조심하자!

 

* Sequence 정의

Sequence를 정의하는 DDL은 다음과 같다. seq_user_id라는 Sequence를 생성해보겠다.

CREATE SEQUENCE seq_user_id
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    CACHE 1;

그리고 해당 Sequence를 사용 권한을 계정에 등록을 해줘야한다!

-- postgres가 OWNER이고
ALTER SEQUENCE seq_user_id
    OWNER TO postgres;

-- 아래 사람들에게 모든 권한을 준다
GRANT ALL ON SEQUENCE seq_user_id TO postgres;
GRANT ALL ON SEQUENCE seq_user_id TO users;

 

Sequence를 생성했으니 테이블에 적용해보자.

CREATE TABLE users
(
    user_id integer NOT NULL DEFAULT nextval('seq_user_id'::regclass),
    id character varying COLLATE pg_catalog."default",
    pw character varying COLLATE pg_catalog."default",
    CONSTRAINT user_pkey PRIMARY KEY (user_id)
)

이제보니 테이블 이름이랑 계정 이름이 users로 겹치네 흠쓰...

 

user_id가 기본키이고 자동으로 증가하게 할 것이다. 그래서 DEFAULT nextval(Sequence) 속성을 추가해주었다.

 

nextval은 위에서 Sequence정의한 것을 토대로 다음번 값을 자동으로 지정해준다.

 

가장 최근 nextval 함수를 호출하여 얻은 값을 쓰고 싶다면 currval(sequence)로 사용할 수 있다.

 

위에 users 테이블에 INSERT를 해보자.

 

* Sequence 적용 후 INSERT문

INSERT INTO users(id,pw)
VALUES ('user_id','user_pw');

처럼 Sequence를 지정해준 user_id 속정을 제외한 id, pw 속성에만 값을 지정해주면 된다.

 

만약 테이블 속성에 Sequence 등록을 해주지 않았어도

 

INSERT INTO users
VALUES (nextval('seq_user_id'),'user_id','user_pw');

위처럼 직접 값을 넣어줘도 된다.

 

user_id가 1부터 1씩 증가하며 들어간다. (1번 row가 0인거는 내가 테스트 해볼려고 사용하던 값이다. 무시해주세여,,,)

 

* ALTER를 이용하여 Sequence 등록

이미 생성된 테이블에 Sequence를 등록하고 싶을 수 있다.

ALTER TABLE users ALTER user_id SET DEFAULT nextval('seq_user_id');

등 으로 컬럼을 변경해주자.

 

* Sequence 확인 및 수정

-- 시퀀스 현재 값 확인
SELECT currval('seq_user_id')

-- 시퀀스 수정
SELECT setval('seq_user_id',값)

-- 시퀀스 상세 수정
ALTER SEQUENCE seq_user_id
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]

* Sequence 접근 권한

GRANT SELECT on seq_category_id to users;


SELECT : currval과 nextval을 사용할 수 있는 권한
ALTER : sequence 변경권한을 줌 
SEQUENCE : alter와 select를 포함 

Sequence를 이용해 기본키 같이 일정하게 증가하는 데이터에 대해서 처리해보자!

 

-끝-

댓글