[PostgreSQL] 用 setval() 設定 sequence 的下一個值

[PostgreSQL] 用 setval() 設定 sequence 的下一個值

平常 database table 的欄位型態如果是設成 SERIAL 的話,

代表的是從 1 開始,依序遞增~

不過今天我想要作個測試,比較兩種程式邏輯的影響,這個程式在跑的時候會去新增資料列,

但我希望跑兩次程式,還能使用到相同的 SERIAL 序列值,

好方便比較,這樣要怎麼辦呢?

 

先用 \d 看一下現有的 table schema,

除了我自己的 tbl_task 資料表外,這裡面的一個 taskid 是 SERIAL 型態的,

因此會有一個 tbl_task_taskid_seq 的 sequence table:

testuser@localhost ~ psql -U myuser -d mydb -c "\d"
List of relations
Schema |                 Name            |   Type   |    Owner
--------+---------------------------------+----------+-------------
public | tbl_task                        | table    | myuser
public | tbl_task_taskid_seq             | sequence | myuser

 

看一下 sequence table 的內容~

last_value 裡儲存的是最後一次 taskid 用到的值,因此下一次會用到的是 2584:

testuser@localhost ~ # psql -U myuser -d mydb -c "select * from tbl_task_taskid_seq"
sequence_name        | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
-----------------------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
tbl_task_taskid_seq |       2583 |           1 |            1 | 9223372036854775807 |         1 |           1 |       8 | t         | t

 

我想讓它下次的值是 2140,因此 last_value 應該要是 2139,

試試看能不能直接改… 但用 UPDATE 指令是不行的:

testuser@localhost ~ # psql -U myuser -d mydb -c "update tbl_task_taskid_seq set last_value=2139"
ERROR:  cannot change sequence "tbl_task_taskid_seq"

 

查了一下,PostgreSQL: Sequence Manipulation Functions 這邊有解答,

可以用 setval() 來設定,例如:

testuser@localhost ~ # psql -U myuser -d mydb -c "select setval('tbl_task_taskid_seq', 2139)"
setval

(本頁面已被瀏覽過 2,033 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料