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 SEQUENCE
URL에서 자세한 내용을 읽을 수 있습니다.
위에서 주어진 사용법을 추적한 다음 NEXTVAL()
기능을 효과적으로 사용할 수 있는 시스템을 구현하려고 합니다. PostgreSQL을 부팅하고 RANDOM_GEN
(임의 생성기의 줄임말)이라는 간단한 테이블을 생성합니다.
CREATE TABLE RANDOM_GENE(
val INT PRIMARY KEY
);
고유하고 임의적이기 때문에 간단한 VALUE
를 테이블의 PRIMARY KEY
로 사용했습니다. 이제 이 테이블에 일부 데이터를 추가해 보겠습니다.
물론 PostgreSQL에서 SEQUENCE GENERATOR
를 사용하려면 VAL
이 RANDOM
이어야 합니다. 우리의 튜토리얼은 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()
의 작동 방식을 완전히 이해하고 원하는 대로 구현할 수 있기를 바랍니다.
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