PostgreSQL 設置主鍵的序列值


1. 問題的提出

PostgreSQL定義TABLE時,主鍵的字段類型可以設定為自增類型serial,即插入每條記錄時,主鍵的值自動加1。但是,當插入數據的時候指定了具體的主鍵值,例如主鍵值從0到500,這時主鍵的序列值不會跟着更新到500。那么以后再自動生成主鍵序列值時,會出現因為主鍵序列值重復而無法插入新的記錄的問題。

 

2. 解決的方法

首先使用MAX函數查詢目前表中最大的主鍵值,然后使用setval函數把最大主鍵值設置為當前的序列值。

假設表名為ApplicationRunInfo, 主鍵字段名為ID,則序列名為ApplicationRunInfo_ID_seq。

獲取當前最大主鍵值:

SELECT MAX("ID") FROM "ApplicationRunInfo";     輸出500

獲取下一個序列值:

SELECT nextval('"ApplicationRunInfo_ID_seq"');   輸出100

設置當前最大主鍵值為序列值:

SELECT setval('"ApplicationRunInfo_ID_seq"', (SELECT MAX("ID") FROM "ApplicationRunInfo"));    輸出500,更新成功

獲取下一個序列值:

SELECT nextval('"ApplicationRunInfo_ID_seq"');   輸出501,問題解決

 

3.注意的事項

使用序列名時要注意,如果序列名中包含大寫,必須寫成'"序列名"',外層單引號,內存雙引號;只使用單引號,則全部轉換成小寫。

   nextval('"ApplicationRunInfo_ID_seq"')    序列名為ApplicationRunInfo_ID_seq

   nextval('ApplicationRunInfo_ID_seq')     序列名為applicationruninfo_id_seq

序列名是表名_主鍵名_seq,可以在數據庫的序列目錄下查看,如下圖所示:

 

SELECT setval('"ApplicationRunInfo_ID_seq"', 42); 下次nextval將返回43
SELECT setval('"ApplicationRunInfo_ID_seq"', 42, true); 和上面一樣返回43
SELECT setval('"ApplicationRunInfo_ID_seq"', 42, false); 下次nextval將返回42


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM