[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,034 次)