PostgreSQL:nextval() 與 currval() 的用法解析

| SQL | 3 Reads

在 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