1. 程式人生 > >PostgreSQL: 資料遷移之序列問題(也可以使用在所有使用序列資料庫上,比如Oracle)

PostgreSQL: 資料遷移之序列問題(也可以使用在所有使用序列資料庫上,比如Oracle)

一、問題背景:

           今天在做一個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(當前的序列值)