一、問題背景:
今天在做一個OA系統,原先的資料庫是Oracle的,後來改到Postgresql資料庫,一開始把資料庫遷移到Postgresql上來,序列和建表都通過Oracle匯出的sql語句來完成,沒有考慮到序列在重新建立後,會重新重初始值開始計算,讓我遇到了現在的問題,新的資料無法插入。這個讓我想起了以前在華為時候,一位DBA跟我說過,資料在遷移的時候一定要先check序列的問題,現在想起來確實,呵呵。
二、如何解決 資料移轉後,序列的問題
當然對於DBA來說,這個必要做的。
1、建立序列
skytf=> create sequence seq_test_1 INCREMENT by 1 MINVALUE 1 NO MAXVALUE start with 1 ;CREATE SEQUENCE
2、查看序列屬性
skytf=> \d seq_test_1 Sequence "skytf.seq_test_1" Column | Type | Value ---------------+---------+--------------------- sequence_name | name | seq_test_1 last_value | bigint | 1 start_value | bigint | 1 increment_by | bigint | 1 max_value | bigint | 9223372036854775807 min_value | bigint | 1 cache_value | bigint | 1 log_cnt | bigint | 0 is_cycled | boolean | f is_called | boolean | f
3、查看序列的Next值
skytf=> select nextval('seq_test_1'); nextval --------- 1(1 row) skytf=> select nextval('seq_test_1'); nextval --------- 2(1 row)
4、查看序列最近使用的值或說是當前值是什麼
skytf=> select currval('seq_test_1'); currval --------- 2(1 row) skytf=> select currval('seq_test_1'); currval --------- 2(1 row)
5、那麼如何解決呢?重設下序列的值
方法一:
skytf=> select setval('seq_test_1',100); setval -------- 100(1 row) skytf=> select currval('seq_test_1'); currval --------- 100(1 row)skytf=> select nextval('seq_test_1'); nextval --------- 101(1 row)說明:把序列修改為100
方法二:
skytf=> alter sequence seq_test_1 restart with 200;ALTER SEQUENCE skytf=> select nextval('seq_test_1'); nextval --------- 200(1 row)skytf=> select nextval('seq_test_1'); nextval --------- 201(1 row)skytf=> \d seq_test_1 Sequence "skytf.seq_test_1" Column | Type | Value ---------------+---------+--------------------- sequence_name | name | seq_test_1 last_value | bigint | 201 start_value | bigint | 200 increment_by | bigint | 1 max_value | bigint | 9223372036854775807 min_value | bigint | 1 cache_value | bigint | 1 log_cnt | bigint | 31 is_cycled | boolean | f is_called | boolean | t
說明把序列的值修改為200(當前的序列值)