PostgreSQL:nextval() 與 currval() 的用法解析
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1118
在 PostgreSQL 中,SEQUENCE
是用來產生連續數值(通常用來當主鍵 ID)的物件。而 nextval()
和 currval()
是兩個與 sequence 緊密相關的函數。
🧮 nextval('sequence_name')
:取得下一個值並遞增
這個函數的作用是從指定的序列中取出「下一個值」,並使序列的值自動遞增。
語法:
SELECT nextval('your_sequence_name');
特性:
-
每次執行都會使 sequence 的值加一(或其他自定步長)。
-
是產生主鍵 ID 最常見的方式。
-
是跨 session 有效的,所有人共享這個序列。
範例:
SELECT nextval('user_id_seq'); -- 假設目前值是 5,執行後返回 6
🕵️ currval('sequence_name')
:取得當前 session 上次產生的值
這個函數會返回「當前資料庫連線」中最近一次執行 nextval()
所產生的值。
語法:
SELECT currval('your_sequence_name');
特性:
-
只對當前 session 有效,其他人不影響你。
-
必須先執行過一次
nextval()
,否則會報錯。 -
常見於插入資料後,想馬上知道剛剛插入的 ID 是多少。
範例:
SELECT currval('user_id_seq'); -- 如果剛剛執行過 nextval(),這裡會返回相同的值
⚠️ 注意:
如果在一個 session 中沒有先執行 nextval()
,直接呼叫 currval()
會出現錯誤:
ERROR: currval of sequence "user_id_seq" is not yet defined in this session
✅ 實用搭配:先插入再查 ID
INSERT INTO users(id, name) VALUES (nextval('user_id_seq'), 'Alice');
SELECT currval('user_id_seq'); -- 獲得剛剛那筆的 ID
不過現在更推薦的方式是直接用 RETURNING
:
INSERT INTO users(name) VALUES('Alice') RETURNING id;
以上。
This article was last edited at