본문 바로가기
IT/SQL 기초강좌 (PostgreSQL)

44강 SQL 초석 다지기 : PostgreSQL SERIAL

by DoitSQL 2022. 12. 23.
728x90

44강 SQL 초석 다지기 : PostgreSQL SERIAL   

PostgreSQL

SQL 초석 다지기 44강 시작합니다.

 

본 강의는 PostgreSQL Tutorial을 참조합니다.  https://www.postgresqltutorial.com/

 

이번 시간에는

 PostgreSQL SERIAL pseudo-type

에 대해서 알아보는 시간입니다.

 

이번 강의에서는 PostgreSQL SERIAL 의사 유형과 SERIAL을 사용하여 테이블에서 자동 증가 열을 정의하는 방법에 대해 배울 것입니다.


Introduction to the PostgreSQL SERIAL pseudo-type   

pseudo-type : data type은 아니나 유사한 형태를 지칭함.  serial type은 1씩 자동증가하는 특성을 가짐

PostgreSQL에서 시퀀스는 정수의 시퀀스를 생성하는 특수한 종류의 데이터베이스 객체이다. 시퀀스는 종종 테이블의 주 키 열로 사용됩니다.

새 테이블을 만들 때 다음과 같이 SERIAL 유사 유형을 통해 시퀀스를 만들 수 있습니다.

CREATE TABLE table_name(
    id SERIAL
);   

 

SERIAL 유사 유형을 ID 열에 할당함으로써 PostgreSQL은 다음을 수행합니다.
● 먼저 시퀀스 개체를 만들고 시퀀스에서 생성된 다음 값을 열의 기본값으로 설정합니다.
● 둘째, 시퀀스가 항상 NULL이 아닌 값인 정수를 생성하므로 NOT NULL 제약 조건을 id 열에 추가합니다.
● 셋째, 시퀀스의 소유자를 ID 열에 할당합니다. 결과적으로 ID 열 또는 테이블이 삭제되면 시퀀스 개체가 삭제됩니다.


다음 문장은 숨긴 의미가 있습니다.

CREATE TABLE table_name(
    id SERIAL
);   

그 의미는 다음 문장에 해당합니다.

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;   

시퀀스를 정의하고 정의된 시퀀스를 키로 사용하는 것이 SERIAL  pseudo-types 사용으로 해결됩니다.

 

PostgreSQL은 다음과 같은 특성을 가진 세 가지 SERIAL  pseudo-types, SMALLSERIAL, SERIAL  및 BIGSERIAL을 제공합니다.

 Name  Storage Size  Range
 SMALLSERIAL  2 bytes  1 to 32,767
 SERIAL  4 bytes  1 to 2,147,483,647
 BIGSERIAL  8 bytes  1 to 9,223,372,036,854,775,807

PostgreSQL SERIAL example   

SERIAL이 암시적으로 열에 인덱스를 만들거나 열을 주 키 열로 만들지는 않습니다. 그러나 SERIAL 열에 기본 키 제약 조건을 지정하여 쉽게 수행할 수 있습니다.

다음 문은 ID 열을 SERIAL 열로 사용하여 과일 테이블을 만듭니다.

CREATE TABLE fruits(
   id SERIAL PRIMARY KEY,
   name VARCHAR NOT NULL
);   

 

테이블에 행을 삽입할 때 SERIAL 열의 기본값을 할당하려면 열 이름을 무시하거나 INSERT 문에서 DEFAULT 키워드를 사용합니다.

 

다음 예를 참조하십시오.

INSERT INTO fruits(name) 
VALUES('Orange');   

or

INSERT INTO fruits(id,name) 
VALUES(DEFAULT,'Apple');   

 

두 행을 과일 테이블에 삽입하고 ID 열의 값은 1과 2입니다.

SELECT * FROM fruits;   

 

테이블에서 SERIAL 열의 시퀀스 이름을 가져오려면 다음과 같이 pg_get_serial_sequence() 함수를 사용합니다.

pg_get_serial_sequence('table_name','column_name')   

 

SELECT pg_get_serial_sequence('fruits', 'id');   

public 스키마에 fruits_id_seq가 생성되었습니다.


시퀀스 이름을 currval() 함수에 전달하여 시퀀스에서 생성된 최근 값을 가져올 수 있습니다. 예를 들어, 다음 문은 fruits_id_seq 개체에 의해 생성된 최근 값을 반환합니다.

SELECT currval(pg_get_serial_sequence('fruits', 'id'));   

currval 대신에 nextval을 사용하면,  다음 값을 리턴하고 현재값도 1 증가 합니다.

테이블에 새로운 값이 입력되면, 내부적으로 nextval을 가지고 와서 입력합니다.

그게 SERIAL TYPE의 특징입니다.

 

테이블에 새 행을 삽입할 때 시퀀스에서 생성된 값을 가져오려면 INSERT 문에서 RETURNING id 절을 사용합니다.
다음 문은 과일 테이블에 새 행을 삽입하고 ID 열에 대해 생성된 값을 반환합니다.

INSERT INTO fruits(name) 
VALUES('Banana')
RETURNING id;   

시퀀스 생성기 작업이 트랜잭션에 안전하지는 않습니다. 즉, 두 개의 동시 데이터베이스 연결이 시퀀스에서 다음 값을 가져오려고 하면 각 클라이언트가 다른 값을 얻게 됩니다. 한 클라이언트가 트랜잭션을 롤백하면 해당 클라이언트의 시퀀스 번호가 사용되지 않아 시퀀스에 공백이 발생합니다.

그렇다고 중복이 발생하지는 않습니다.



이 강의에서는 PostgreSQL 유사 유형 SERIAL을 사용하여 테이블에 대한 자동 증가 열을 만드는 방법에 대해 배웠습니다.

 

수고하셨습니다.


Do it! SQL을 찾아 주셔서 감사합니다. 공감 ♥ , 댓글이 큰 힘이 됩니다.

 

728x90

댓글