반응형
해당 글에서는 PostgreSQL에서 Auto Increment로 사용되는 Serial데이터 타입에 대해서 알아봅니다.
1) Auto Increment
💡 Auto Increment
- 데이터베이스에서 자동으로 값을 증가시키는 기능을 의미합니다.
- 주로 테이블의 기본키(Primary Key)에 사용되며, 새로운 레코드가 추가될 때마다 자동으로 고유한 숫자 값이 증가하여 할당됩니다.
2) Serial Data Type
💡 Serial Data Type
- 자동 증가하는 정수 값을 생성하는 특수한 데이터 타입을 의미합니다.
- 일반적으로 기본 키 필드에서 사용됩니다.
1. Serial 타입의 종류
💡 Serial 타입의 종류
- Serial 타입의 종류로는 SMALLSERIAL, SERIAL, BIGSERIAL로 구성이 되어 있습니다.
데이터 타입 | Storage Size | 범위 | 설명 |
SMALLSERIAL(=SERIAL2) | 2byte | 1 to 32,767 | 16비트 정수 값의 자동 생성 열을 나타내는 데이터 타입입니다. |
SERIAL(=SERIAL4) | 4byte | 1 to 2,147,483,647 | 32비트 정수 값의 자동 생성 열을 나타내는 데이터 타입입니다 |
BIGSERIAL(=SERIAL8) | 8byte | 1 to 9,223,372,036,854,775,807 | 64비트 정수 값의 자동 생성 열을 나타내는 데이터 타입입니다 |
2. Serial 타입 vs Sequence 객체
💡 시퀀스(Sequence)
- 일련의 정수 값을 생성하는 데이터베이스 객체입니다.
- 일반적으로 테이블의 기본 키 필드와 같은 곳에서 사용되어 새로운 레코드가 추가될 때마다 자동으로 증가하거나 사용자가 지정한 규칙에 따라 증가하는 값을 제공합니다.
- 특정 테이블에 속하지 않고 데이터베이스 전체에서 공유될 수 있으므로, 여러 테이블에서 동일한 시퀀스 값을 사용하는 것이 가능합니다.
분류 | Serial 타입 | Sequence 객체 |
정의 | 자동적으로 증가하는 정수를 생성하는 데이터 타입 | 사용자가 지정하는 규칙에 따라 일련번호를 생성하는 객체 |
사용 용도 | 주로 기본 키로 사용 | 테이블의 특정 컬럼에 일련번호를 생성하거나, 여러 테이블에 걸쳐 일련번호를 생성하는 등 다양한 용도로 사용 |
사용 방법 | CREATE TABLE 문의 컬럼 데이터 타입으로 SERIAL을 지정 | CREATE SEQUENCE 문으로 시퀀스를 생성 후, NEXTVAL 함수를 사용하여 일련번호를 생성 |
특징 | 내부적으로 시퀀스를 생성하여 사용 | 사용자가 직접 시퀀스의 규칙을 지정 가능 |
2.1. Serial 타입을 포함한 테이블을 생성하면 Sequence 객체도 생성된다.
💡 최초 테스트 스키마 내에서 아래와 같이 시퀀스 영역은 존재하지 않았습니다.
💡 아래의 SQL 문을 입력하여 테이블을 생성하였습니다.
- 테이블 내에는 user_sq로 SERIAL 타입이 포함되어 있습니다.
-- DDL
create table tb_user
(
user_sq SERIAL not null
primary key,
user_id text,
user_pw text,
user_nm text,
user_st text
);
alter table tb_user
owner to localmaster;
💡 실제 따로 시퀀스 객체를 생성하지 않았지만 시퀀스가 생김을 확인할 수 있습니다.
2.2. SERIAL 타입도 nextval()을 통해 가져올 수 있는가?
💡 SERIAL 타입도 nextval()을 통해 가져올 수 있는가?
-결론은 가능합니다. 시퀀스로 생성이 되었기에 시퀀스의 다음 값을 가지는 nextval()을 통해서 호출이 가능합니다.
- 생성한 스키마와 테이블, 컬럼명을 입력하여 시퀀스로 조회하고 nextval()을 통해 다음 값을 호출하면 현재 SERIAL 타입의 마지막 다음 값을 반환받을 수 있습니다.
💡 아래와 같이 현재 SERIAL 타입의 마지막 값을 확인하였습니다.
💡 아래의 SQL문을 통해 마지막 SERIAL 타입의 다음 값을 확인합니다.
select nextval(pg_get_serial_sequence('public.tb_user', 'user_sq'));
💡 [참고] Sequence에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
3. SERIAL 타입 vs DEFAULT 속성
💡 DEFAULT 속성
- 특정 컬럼에 지정한 기본 값을 의미합니다. 데이터를 입력할 때 해당 컬럼에 대해 값을 명시적으로 지정하지 않았을 경우에 사용됩니다.
항목 | SERIAL 타입 | DEFAULT 속성 |
정의 | 자동적으로 증가하는 정수를 생성하는 데이터 타입 | 특정 컬럼에 대한 기본 값을 설정 |
주로 사용되는 경우 | 주로 기본 키로 사용 | 데이터를 입력할 때 해당 컬럼에 대해 값을 명시적으로 지정하지 않았을 경우 |
자동 증가 | 새로운 레코드가 추가될 때마다 자동으로 증가 | 자동 증가 기능 없음 |
데이터 타입 | 정수 | 어떤 데이터 타입이든 설정 가능 |
3) Serial Type 테이블 컬럼 생성 및 컬럼 값 추가
1. 테이블 컬럼 생성
CREATE TABLE fruits(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
💡 위에서 SERAIL 타입을 둔 컬럼을 테이블로 생성하면 아래의 과정을 통해 SEQUENCE도 역시 생성이 됩니다.
CREATE SEQUENCE table_name_id_seq;
CREATE TABLE table_name (
id integer NOT NULL DEFAULT nextval('table_name_id_seq')
);
ALTER SEQUENCE table_name_id_seq
OWNED BY table_name.id;
2. 테이블 컬럼 값 추가
-- [CASE1] SERIAL 타입은 자동 채번이 되기에 추가 시 무시하셔도 됩니다.
INSERT INTO fruits(name)
VALUES('Orange');
-- [CASE2] SERIAL 타입에 대해 DEFAULT로 값을 넣으면 자동 채번이 됩니다.
INSERT INTO fruits(id,name)
VALUES(DEFAULT, 'Apple');
3. SERIAL 생성 이후 반환받기
💡 SERIAL 생성 이후 반환받기
- RETURNING <<컬럼명>>을 통해서 INSERT 작업을 수행한 뒤 응답 값으로 SERIAL 타입으로 지정한 id를 반환받습니다.
-- INSERT를 수행하고 SERAIL 타입의 컬럼명인 'ID'를 입력하면 입력된 값을 반환 받을 수 있습니다.
INSERT INTO fruits(name)
VALUES('Banana')
RETURNING id;
💡 참고 사이트
오늘도 감사합니다. 😀
반응형
'DB > 이론 및 문법' 카테고리의 다른 글
[DB/Postgres] PL/pgSQL 함수, 프로시저 예외처리 사용방법 : Exception Handling (2) | 2024.01.30 |
---|---|
[DB/Postgres] 저장 프로시저(Stored Procedure) 매개변수 사용방법 : IN, OUT, INOUT (1) | 2024.01.27 |
[DB/Postgres] 조건식과 연산자: CASE, COALESCE, NULLIF, CAST (0) | 2023.11.15 |
[DB] 관계형 데이터베이스(RDBMS) 구조 : DDL, DML, DCL, TCL (1) | 2023.11.14 |
[DB/mongo] Document DB 이해하기 -2 : MongoDB 및 Robo 3T 설치 및 사용예시 (0) | 2023.09.24 |