nextval(regclass)
시퀀스의 다음 값을 리턴하는 함수로 thread-safe 하다.
👉🏻 여러 세션에서 이 함수를 동시에 실행하면 각각 다른 값을 갖게한다.
💡 nextval() 을 호출하면 가리키고 있던 시퀀스는 반환하고 곧바로 다음 시퀀스를 가리킨다.
ex) nextval(table_name_pkpk:regclass)
=> 1000 // 리턴은 1000을 받아왔지만 이미 테이블은 다음 시퀀스로 '1001'을 가리키고 있다.
다른 세션에서 INSERT 쿼리 -> 1001 입력
regclass
regclass?
시퀀스의 Object ID (OID) 를 의미.
이게 왜 필요할까?
OID는 여러 시스템 테이블에 쓰이는 기본키다.
OID 는 자체적인 동작이 없다. 그저 의미있는 이름을 시스템 오브젝트로 변환해주는 키워드일 뿐이다.
보통 OID에는 모두 `alias` 를 지정하게 되있다.
특정 시퀀스를 불러올 때 모두 `regclass` 키워드를 넣어 해당 시퀀스의 OID 값을 받아온다.
currval(regclass)
현재 세션에서 가장 최근에 `nextval` 을 통해 받아온 시퀀스 값을 리턴한다.
=> `nextval` 호출 없이 바로 이 함수를 호출하면 에러가 발생한다.
이 함수는 session-local value 를 리턴하기 때문에 현재 세션에서 우선 nextval 호출이 선행되어야한다.
lastval()
현재 새션 내에서 가장 최근에 `nextval` 로 받아온 값. == currval 과 거의 동일.
파라미터에 시퀀스명이 없다. => 어떤 시퀀스든 가장 최근에 `nextval` 로 받아온 값을 리턴한다.
시퀀스값 수정 및 초기화
이미 생성된 `table_name_pkpk_seq` 시퀀스 값을 1000부터 시작하고 싶다고 해보자.
⚠️ 이것만 해서는 시퀀스 값 변경이 적용되지 않는다.
The optional clause `START WITH` start
changes the recorded start value of the sequence. This has no effect on the
current sequence value;
it simply sets the value that future ALTER SEQUENCE RESTART commands will use.
👉🏻 현재 시퀀스 값에는 아무런 영향을 주지 않으므로 `ALTER SEQUENCE RESTRT` 를 사용하라
🔗 Reference
'DataBase > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] Transaction + Pool 사용시 주의 (0) | 2022.04.04 |
---|---|
[PostgreSQL] Function (feat. trigger) (0) | 2022.03.29 |
[PostgreSQL] Notify (0) | 2022.03.25 |
[PostgreSQL] Transaction 왜, 언제, 어떻게 동작하나? (0) | 2022.03.25 |
Description on DB Column (0) | 2022.03.18 |