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