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를 이용해 기본키 같이 일정하게 증가하는 데이터에 대해서 처리해보자!
-끝-
댓글