Skill/postgreSQL

PostgreSQL) Sequence 생성, 활용, 초기화

진열사랑 2024. 10. 7. 14:30

출처  : https://hotte.tistory.com/m/2

Incremental Unique Key Sequence 를 생성하기 위해

PostgreSQL , ORACLE 은 SEQUENCE 라고 불리는 독립 오브젝트를 제공하며,

SQL-Server , Sybase 은 컬럼에 IDENTITY 속성을,

MySQL 은 컬럼에 AUTO_INCREMENT 속성을 사용한다.

이번 포스팅에서는 PostgreSQL 에서 SEQUENCE 오브젝트 관련 Function 을
정리하고 활용 예제를 작성해 보도록 하겠다.

SEQUENCE 관련 주요 Function 정리
nextval(seq_name) - 시퀀스 값을 증가시키고 리턴한다.
currval(seq_name) - 가장 최근 nextval 함수를 호출하여 얻은 값을 리턴한다. 현재 세션에서 nextval 을 호출하지 않았을 경우 오류를 반환한다.
select currval('seq_student');

********** Error **********
ERROR: currval of sequence "seq_student" is not yet defined in this session
SQL state: 55000
setval(seq_name, value) - 시퀀스의 현재값을 특정값(value)으로 초기화 한다.
시퀀스 생성
CREATE SEQUENCE seq_student START 1;
CASE 1. 테이블 생성시 ID 컬럼에 DEFAULT 속성 부여
-- 테이블 생성
CREATE TABLE student
(
  id integer DEFAULT nextval('seq_student'),
  name varchar(50),
  eml varchar(100),
  birthday char(8),
  gender char(1),
  constraint pk_student primary key (id)
);

-- 데이터 입력 (id 컬럼은 INSERT 컬럼에서 제외한다.)
INSERT INTO student (name,eml,birthday,gender)
VALUES ('홍길동','hgd@mail.com','18830101','M');

INSERT INTO student (name,eml,birthday,gender)
VALUES ('이순신','lss@mail.com','16830201','F');

INSERT INTO student (name,eml,birthday,gender)
VALUES ('유관순','ygs@mail.com','19030301','M');

INSERT INTO student (name,eml,birthday,gender)
VALUES ('임꺽정','lgj@mail.com','15830401','F');
CASE 2. DEFAULT 속성을 쓰지 않고 INSERT 시점에 VALUE 로 입력
-- 테이블 생성
CREATE TABLE student
(
  id integer,
  name varchar(50),
  eml varchar(100),
  birthday char(8),
  gender char(1),
  constraint pk_student primary key (id)
);

-- 데이터 입력
INSERT INTO student (id,name,eml,birthday,gender)
VALUES (nextval('seq_student'),'홍길동','hgd@mail.com','18830101','M');

INSERT INTO student (id,name,eml,birthday,gender)
VALUES (nextval('seq_student'),'이순신','lss@mail.com','16830201','F');

INSERT INTO student (id,name,eml,birthday,gender)
VALUES (nextval('seq_student'),'유관순','ygs@mail.com','19030301','M');

INSERT INTO student (id,name,eml,birthday,gender)
VALUES (nextval('seq_student'),'임꺽정','lgj@mail.com','15830401','F');