PostgreSQL의 NEXTVAL 함수

Bilal Shahid 2023년6월20일
PostgreSQL의 NEXTVAL 함수

NEXTVAL()은 개체를 다른 값으로 진행하고 반환하는 경향이 있습니다. ‘SEQUENCE OBJECTS’는 PostgreSQL의 ‘SEQUENCES’에서 생성된 단일 행 테이블입니다.

NEXTVAL() 함수는 SEQUENCE MANIPULATION FUNCTIONS에서 정의됩니다.

nextval ( regclass ) ? bigint

‘REGCLASS’는 ‘SEQUENCE OBJECT’를 참조하며 이 함수는 ‘BIGINT’를 반환하는 경향이 있습니다. 이제 이 NEXTVAL() 함수의 가능한 구현과 이를 사용하는 방법을 살펴보겠습니다.

PostgreSQL에서 NEXTVAL()의 실제 예

PostgreSQL에서 SEQUENCE IDENTIFIERS의 용도 중 하나는 고유한 행 식별자 값을 가져오는 데 사용할 수 있는 방법입니다. CREATE SEQUENCEURL에서 자세한 내용을 읽을 수 있습니다.

위에서 주어진 사용법을 추적한 다음 NEXTVAL() 기능을 효과적으로 사용할 수 있는 시스템을 구현하려고 합니다. PostgreSQL을 부팅하고 RANDOM_GEN(임의 생성기의 줄임말)이라는 간단한 테이블을 생성합니다.

CREATE TABLE RANDOM_GENE(
	val INT PRIMARY KEY
);

고유하고 임의적이기 때문에 간단한 VALUE를 테이블의 PRIMARY KEY로 사용했습니다. 이제 이 테이블에 일부 데이터를 추가해 보겠습니다.

물론 PostgreSQL에서 SEQUENCE GENERATOR를 사용하려면 VALRANDOM이어야 합니다. 우리의 튜토리얼은 UNIQUE VAL을 얻기 위해 값을 증가시키는 SERIAL GENERATOR를 사용합니다.

CREATE SEQUENCE serial_num;

그리고 이 SEQUENCE GENERATOR의 값을 사용하기 위해 이 테이블에서 SELECT 작업을 쿼리할 수 있습니다.

SELECT * from SERIAL_NUM;

그러나 문제가 있습니다. 이 SELECT 작업을 반복적으로 호출하면 SEQUENCE GENERATOR에서 동일한 값을 얻는 경향이 있습니다.

따라서 테스트 없이 이 SEQUENCE의 값을 테이블에 INSERT했다면 값이 중복되었을 것입니다.

여기서 NEXTVAL() 함수가 사용됩니다. 계속해서 이 GENERATOR의 값을 증가시킨 다음 SELECT 작업을 실행하여 오름차순 값을 얻을 수 있습니다.

따라서 다음과 같이 작성할 수 있습니다.

SELECT * from NEXTVAL('serial_num');

그러면 다음과 같이 출력이 반환됩니다. 예를 들어 5번 반복합니다.

출력:

Iter      VAL
1          1
2          2
3          3
4          4
5          5

따라서 NEXTVAL()은 우리가 본 것처럼 SEQUENCE GENERATOR를 증가시키고 전진시키는 경향이 있습니다. 따라서 NEXTVAL()이 인수에 전달된 SEQUENCE에 대해 호출될 때마다 SEQUENCE가 다음 오름차순 값을 가리키는 것을 상상할 수 있습니다.

따라서 이제 RANDOM_GEN 테이블에 대한 INSERT 작업에 대해 다음과 같이 무언가를 호출할 수 있습니다.

INSERT INTO RANDOM_GENE values (NEXTVAL('SERIAL_NUM')), (NEXTVAL('SERIAL_NUM')), (NEXTVAL('SERIAL_NUM'));

이제 테이블은 다음과 같이 표시됩니다.

출력:

        val
1       1
2       2
3       3

VALUE 열에 대해서만 이를 달성하는 또 다른 간단한 방법은 CREATE TABLE 문에서 바로 NEXTVAL()을 정의하는 것입니다. 다음과 같이 쿼리를 작성할 수 있습니다.

CREATE TABLE RANDOM_GENE(
	val INT primary key default NEXTVAL('SERIAL_NUM')
);

DEFAULT를 사용하여 SEQUENCE GENERATOR에서 값을 가져오는 이 VAL 열의 기본 동작을 정의했습니다. 물론 위의 내용은 보조 열이 없으면 쓸모가 없으므로 USER_NAME 열을 추가하여 RANDOM_GEN 값을 받는 USERS를 정의합니다.

CREATE TABLE RANDOM_GENE(
	val INT primary key default NEXTVAL('SERIAL_NUM'),
        name TEXT
);

이제 다음과 같이 INSERT 문을 작성할 수 있습니다.

INSERT into RANDOM_GENE (name) values ('John'), ('Marta'), ('Alex');

그러면 SEQUENCE GENERATOR에서 오름차순으로 얻은 각 값과 함께 테이블에 쿼리에 지정된 이름을 INSERT합니다. 지금 표를 보는 경향이 있다면 다음과 같을 것입니다.

val     name
1	"John"
2	"Marta"
3	"Alex"

따라서 우리는 이제 NEXTVAL()이 어떻게 작동하는지 완전히 이해했습니다. 지금은 다양한 환경에서 NEXTVAL()의 작업을 살펴보겠습니다.

PostgreSQL의 다양한 환경과 상황에서의 NEXTVAL()

NEXTVAL()을 사용하면 호출될 때마다 SEQUENCE GENERATOR가 증가하는 경향이 있습니다. 따라서 이 경우 중복에 대해 걱정할 필요가 없습니다.

NEXTVAL()이 호출되면 GENERATOR가 진행되어 다음 값을 계산합니다. 동일한 SEQUENCE에 대해 NEXTVAL()을 호출하는 동시에 실행 중인 다른 쿼리는 생성기의 완전히 다른 고유한 값을 가져옵니다.

따라서 Postgres 서버에서 쿼리를 실행할 수 있는 여러 트랜잭션 및 프로세스에 NEXTVAL()을 사용하는 것이 효율적이고 안전합니다.

PostgreSQL에서 NEXTVAL()과의 차이 및 값 차이

NEXTVAL()에서 발견되는 일반적인 문제는 엄격한 개선 구현입니다. SEQUENCE가 새 값으로 진행되면 다시 돌아가거나 이전 값이 사용되었는지 여부를 확인할 가능성이 거의 없습니다.

따라서 UNIQUE 값 열과 NAME이 있는 테이블이 있고 INSERT하려는 NAME이 이미 테이블에 있는 경우 위반 오류가 발생할 수 있습니다. NEXTVAL()은 해당 시나리오에서 이미 호출되었을 것입니다.

그리고 SEQUENCE는 값으로 발전했지만 위반으로 인해 INSERTION이 방지됩니다. 따라서 다음에 INSERT가 호출되면 NEXTVAL()이 다시 한 번 진행되고 이전 값은 완전히 건너뜁니다.

ON CONFLICT 작업 또는 제대로 실행되지 않을 수 있는 작업에 대해서도 마찬가지입니다. 아래 제공된 예에서 다음을 사용하여 NAME 테이블 열에서 INSERT를 호출합니다.

name TEXT unique

그런 다음 다음과 같은 쿼리를 사용하여 ALEX에 대한 의도적인 중복 이름을 사용하여 데이터를 테이블에 INSERT합니다.

INSERT into RANDOM_GENE (name) values ('John'), ('Marta'), ('Alex'), ('Alex'), ('Mathew') on conflict (name) do nothing;

중복 위반 오류를 우회하고 VALUE에 대한 테이블을 확인하기 위해 ON CONFLICT를 넣었습니다. 이제 테이블은 다음과 같습니다.

val    name
1	"John"
2	"Marta"
3	"Alex"
5	"Mathew"

VAL에 대해 숫자 4 값이 없음을 알 수 있습니다. 이는 중복 ALEX 삽입이 SEQUENCE GENERATOR를 진행했지만 INSERTED를 얻지 못했기 때문입니다.

따라서 MATHEW라는 이름의 값은 이미 4였으며 INSERTION의 값은 5로 증가했습니다.

이제 NEXTVAL()의 작동 방식을 완전히 이해하고 원하는 대로 구현할 수 있기를 바랍니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

관련 문장 - PostgreSQL Function